Shell script error

chipset

Shell script error
« kdy: 18. 06. 2018, 21:03:56 »
Zdravím,

mám zde error v mém scriptu, který má sledovat místo na disku a při 90% tresholdu poslat mail. Jede to na HP-UX

 Zde je scrip:

Kód: [Vybrat]
bdf | grep -vE '^/opt/xip/xib/' | awk '{ print $5 " " $1 }' | while read output;
do
echo $output
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1  )
partition=$(echo $output | awk '{ print $2 }' )
if [ $usep -ge 90 ]; then
echo "Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)

This is system generated e-mail " |
mailx -s "Alert: Almost out of disk space $usep%" email@server.com
fi
done

Při spuštění scriptu mu to vyhodít tento error
Kód: [Vybrat]
syntax error at line 12 : `done' unexpected

Jsem slepej, nebo tam fakt není nikde apostrof navíc?


gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Shell script error
« Odpověď #1 kdy: 18. 06. 2018, 21:23:28 »
mate preruseny radek uprostred retezce a za pipe

nobody(ten pravej)

Re:Shell script error
« Odpověď #2 kdy: 19. 06. 2018, 00:03:00 »
jak pise gll, pokud trhas radek, musi byt na konci znak \ kterej rika, "nasledujici radek je pokracovani stavajiciho"...

obycajnyslovak

Re:Shell script error
« Odpověď #3 kdy: 19. 06. 2018, 01:21:51 »
jak pise gll, pokud trhas radek, musi byt na konci znak \ kterej rika, "nasledujici radek je pokracovani stavajiciho"...
V shelli za pipe netreba backslash, pocita sa s nim automaticky.

Ja by som odmazal posledny znak v prvom riadku.

Kit

Re:Shell script error
« Odpověď #4 kdy: 19. 06. 2018, 08:52:51 »
V tom skriptu je spousta potenciálních děr a také zbytečností. Určitě se to celé dá zkrátit na polovinu a zprovoznit. Grep a awk se obvykle dá snadno sloučit, echo $output je tam také zcela zbytečně, pokud $output zrušíš.

Kód: [Vybrat]
bdf | awk '/^\/opt\/xip\/xib\// { if($5>=90) print $5 " " $1 }' |
    while read usep partition; do
        echo "Running out of space \"$partition ($usep)\""|
            mailx -s "Alert: Almost out of disk space $usep" email@server.com
    done


FAT32

Re:Shell script error
« Odpověď #5 kdy: 19. 06. 2018, 09:59:29 »
V tom skriptu je spousta potenciálních děr a také zbytečností. Určitě se to celé dá zkrátit na polovinu a zprovoznit. Grep a awk se obvykle dá snadno sloučit, echo $output je tam také zcela zbytečně, pokud $output zrušíš.

Kód: [Vybrat]
bdf | awk '/^\/opt\/xip\/xib\// { if($5>=90) print $5 " " $1 }' |
    while read usep partition; do
        echo "Running out of space \"$partition ($usep)\""|
            mailx -s "Alert: Almost out of disk space $usep" email@server.com
    done

Děkuji moc za tip, ovšem stále se potýkám se stejným problémem, že to nechce zbaštit "done" hlásí to po testu vašeho scriptu
Kód: [Vybrat]
syntax error at line 5 : `done' unexpected říkám si, jestli není někde zakopaný pes kvůli HP-UX?

FAT32

Re:Shell script error
« Odpověď #6 kdy: 19. 06. 2018, 10:02:29 »
V tom skriptu je spousta potenciálních děr a také zbytečností. Určitě se to celé dá zkrátit na polovinu a zprovoznit. Grep a awk se obvykle dá snadno sloučit, echo $output je tam také zcela zbytečně, pokud $output zrušíš.

Kód: [Vybrat]
bdf | awk '/^\/opt\/xip\/xib\// { if($5>=90) print $5 " " $1 }' |
    while read usep partition; do
        echo "Running out of space \"$partition ($usep)\""|
            mailx -s "Alert: Almost out of disk space $usep" email@server.com
    done

Děkuji moc za tip, ovšem stále se potýkám se stejným problémem, že to nechce zbaštit "done" hlásí to po testu vašeho scriptu
Kód: [Vybrat]
syntax error at line 5 : `done' unexpected říkám si, jestli není někde zakopaný pes kvůli HP-UX?


Teď mi vlastně došlo, že "done" je bashovsky, nebo ne? Nění najaká shell alternativa, nebo ksh alternativa?

Kit

Re:Shell script error
« Odpověď #7 kdy: 19. 06. 2018, 10:23:01 »
V tom skriptu je spousta potenciálních děr a také zbytečností. Určitě se to celé dá zkrátit na polovinu a zprovoznit. Grep a awk se obvykle dá snadno sloučit, echo $output je tam také zcela zbytečně, pokud $output zrušíš.

Kód: [Vybrat]
bdf | awk '/^\/opt\/xip\/xib\// { if($5>=90) print $5 " " $1 }' |
    while read usep partition; do
        echo "Running out of space \"$partition ($usep)\""|
            mailx -s "Alert: Almost out of disk space $usep" email@server.com
    done

Děkuji moc za tip, ovšem stále se potýkám se stejným problémem, že to nechce zbaštit "done" hlásí to po testu vašeho scriptu
Kód: [Vybrat]
syntax error at line 5 : `done' unexpected říkám si, jestli není někde zakopaný pes kvůli HP-UX?

Vzhledem k tomu, že mně to v Bashi na Linuxu normálně funguje, tak bych také viděl problém v nějaké specialitě HP-UX. Zkusil bych odebírat řádky, např. volání mailx. Mělo by to jen vypsat výsledek na monitor.

Kit

Re:Shell script error
« Odpověď #8 kdy: 19. 06. 2018, 10:31:57 »
Teď mi vlastně došlo, že "done" je bashovsky, nebo ne? Nění najaká shell alternativa, nebo ksh alternativa?

Funguje mi to i v sh.

Kit

Re:Shell script error
« Odpověď #9 kdy: 19. 06. 2018, 10:39:31 »
Nemáš náhodou spuštěný csh, který má jinou syntaxi while?

FAT32

Re:Shell script error
« Odpověď #10 kdy: 19. 06. 2018, 10:47:18 »
Nemáš náhodou spuštěný csh, který má jinou syntaxi while?

csh tam je, ale nevím jak zjistit jestli nemá puštěny nějaký while. Dá se to nějak vyšťourat?

Kit

Re:Shell script error
« Odpověď #11 kdy: 19. 06. 2018, 10:52:31 »
Nemáš náhodou spuštěný csh, který má jinou syntaxi while?

csh tam je, ale nevím jak zjistit jestli nemá puštěny nějaký while. Dá se to nějak vyšťourat?

Zkus místo "done" napsat "end".

FAT32

Re:Shell script error
« Odpověď #12 kdy: 19. 06. 2018, 10:55:28 »
Nemáš náhodou spuštěný csh, který má jinou syntaxi while?

csh tam je, ale nevím jak zjistit jestli nemá puštěny nějaký while. Dá se to nějak vyšťourat?

Zkus místo "done" napsat "end".
Vypadá to, že jsi měl zřejmě pravdu
Kód: [Vybrat]
./disk_check.sh: ^M:  not found
./disk_check.sh: syntax error at line 2 : `while' unmatched

erik80

Re:Shell script error
« Odpověď #13 kdy: 19. 06. 2018, 10:56:58 »
V tom skriptu je spousta potenciálních děr a také zbytečností. Určitě se to celé dá zkrátit na polovinu a zprovoznit. Grep a awk se obvykle dá snadno sloučit, echo $output je tam také zcela zbytečně, pokud $output zrušíš.

Kód: [Vybrat]
bdf | awk '/^\/opt\/xip\/xib\// { if($5>=90) print $5 " " $1 }' |
    while read usep partition; do
        echo "Running out of space \"$partition ($usep)\""|
            mailx -s "Alert: Almost out of disk space $usep" email@server.com
    done

naco je tam vobec ten cyklus? text emailu naformatujem v tom awk a prepipujem do mailx. ci mi nieco unika?

Kit

Re:Shell script error
« Odpověď #14 kdy: 19. 06. 2018, 11:09:09 »
Vypadá to, že jsi měl zřejmě pravdu
Kód: [Vybrat]
./disk_check.sh: ^M:  not found
./disk_check.sh: syntax error at line 2 : `while' unmatched

Takže když tam vrátíš "done", uložíš do souboru a na začátek napíšeš "#!/bin/sh", tak by to mělo fungovat.