Bash shellscripthez aki ért, megmondaná mi a hiba?
Beadandót írok, a feladat az, hogy egy paraméterrel hívjuk meg, egy tantárgy nevével. A program két txt fájlt kap rögzített bemenetként, az egyikben nevek és tárgyakból hiányzások vannak, a másikban tantárgyak és a megengedett hiányzások száma, a programnak pedig ki kell írnia azokat, akik túllépik.
#!/bin/bash
if [ "$#" -ne 1 ]
then
echo "A program egy tantárgy nevét várja bemenetként!"
exit 1
fi
grep -i "$tantargy" tantargyak.txt | cut -d":" -f2 |
xargs -I {} grep -i {} tanulok.txt | \
num_lectures=$(grep -i "$tantargy" tantargyak.txt | cut -d":" -f3)
num_skippable=$(grep -i "$tantargy" tantargyak.txt | cut -d":" -f4)
num_skipped=$((num_lectures - 3))
if [ $num_skipped -ge $num_skippable ]
then echo "$2"
fi
exit 0
ezt tudtam összehozni, de nem akar működni! előre is köszi annak, aki segít!
Egész pontosan hol akad el?
tedd az elejére ezt az első if fölé: set -x
és futtatáskor kiírja, hol áll meg.
Amúgy a végén az echo "$2" gyanús, mert azt írtad, 1 paramétert vár a script, miközben a $2 már a másodikat jelezné, így ez nem input neki.
Igen, most így ránézve én sem értem.
-x-re tesztelve végig fut a program, csak eredményt nem ad.
Ennek fényében tudom, hogy valszeg a "grepelést" rontom el! Azt el tudná mondani valamelyikőtök, hogy hogyan tudom megcsinálni?
Csak egy tanács, ebben az esetben a grep nem egy robosztus megoldás. Itt oszlopok közötti teljes egyezést kell keresni, ezért nem elég csak grep-pelni. Gondolj bele pl. abba, hogyha van egy "Analizis" és egy "Analizis gyakorlat" nevű tárgy, akkor, amikor az analizisre keresel, akkor a gyakorlat is fel fog jönni. Itt én awk-ot használnék a helyedben. valahogy így
awk -var tant="${tantargy}" -F":" '$2 == tant'
De a kérdésben leírt script-ben eleve nincs definiálva a tantargy valtozo.... valami ilyesmi hiányzik:
tantargy="${1}"
És még egy tipp:
num_skipped=$((num_lectures - 3))
Szerintem ez nem a num_skipped, azaz a kihagyott órák, hanem a kihagyható, azaz a num_skippable változó. (Úgy értelmezem, hogy maximum 3 órát lehet hiányozni) Különben így első blikkre elég értelmetlennek néz ki ez a művelet.
Ha az első grep output-ját pipe-olod az xargs parancsba, és van sortörés, akkor kell a cut utáni pipe jel után egy \ karakter.
Ennek kimenetét kell egy loopban beolvasni. Walami ilyesmiről lenne szó:
xargs -I {} grep -i {} tanulok.txt | while read line; do
Jaja, és az echo $2 a végén tényleg eléggé értelmezhetetlen. Azt gyanítom, hogy itt egy névnek kellene lennie, amit a tanulok.txt-ből olvas ki. De ezt nem tárolod el sehova.
Összeségében elég messze állsz a végétől. :(
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!