Chcel by som, aby môj skript Bash vypísal chybovú správu, ak nie je splnený požadovaný počet argumentov.
Vyskúšal som nasledujúci kód:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Z nejakého neznámeho dôvodu som dostal nasledujúcu chybu:
test: line 4: [2: command not found
Čo robím zle?
Tak ako každý iný jednoduchý príkaz, aj [ ... ]
alebo test
vyžaduje medzi svojimi argumentmi medzery.
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
Alebo
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
V jazyku Bash radšej používajte [[ ]]
, pretože v ňom nedochádza k deleniu slov a expanzii názvov ciest na premenné, ktoré nemusia byť citované, pokiaľ nie sú súčasťou výrazu.
[[ $# -ne 1 ]]
Má aj niektoré ďalšie funkcie, ako je zoskupovanie podmienok bez úvodzoviek, porovnávanie vzorov (rozšírené porovnávanie vzorov pomocou extglob
) a porovnávanie regexov.
Nasledujúci príklad kontroluje, či sú argumenty platné. Povoľuje jeden alebo dva argumenty.
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
Pre čisto aritmetické výrazy môže byť pre niektoré stále lepšie použitie (( ))
, ale stále sú možné v [[ ]]
s jeho aritmetickými operátormi ako -eq
, -ne
, -lt
, -le
, -gt
, alebo -ge
umiestnením výrazu ako jediného reťazcového argumentu:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
To by malo byť užitočné, ak by ste to potrebovali kombinovať aj s inými funkciami [[ ]]
.
Je'tiež logické, aby sa skript ukončil, keď sú mu odovzdané neplatné parametre. To už v komentároch navrhol ekangas, ale niekto túto odpoveď upravil tak, aby mala ako vrátenú hodnotu -1
, takže by som to mohol urobiť aj ja.
-1
síce Bash akceptuje ako argument pre exit
, ale nie je explicitne zdokumentovaný a nie je správne ho používať ako bežný návrh. 64
je tiež najformálnejšia hodnota, pretože je'definovaná v sysexits.h
pomocou #define EX_USAGE 64 /* chyba použitia príkazového riadku */
. Väčšina nástrojov, ako napríklad ls
, tiež vracia 2
pri neplatných argumentoch. Aj ja som kedysi vo svojich skriptách vracal 2
, ale v poslednom čase ma to už veľmi nezaujímalo a jednoducho som pri všetkých chybách používal 1
. Ale dajme sem len 2
, pretože je to najbežnejšie a pravdepodobne nie je špecifické pre operačný systém.
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters"
exit 2
fi
Ak pracujete s číslami, je vhodné použiť aritmetické výrazy.
if (( $# != 1 )); then
echo "Illegal number of parameters"
fi