Želim, da moja skripta Bash izpiše sporočilo o napaki, če zahtevano število argumentov ni izpolnjeno.
Poskusil sem z naslednjo kodo:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Iz neznanega razloga sem dobil naslednjo napako:
test: line 4: [2: command not found
Kaj delam narobe?
Tako kot katerikoli drug preprost ukaz tudi [ ... ]
ali test
zahteva presledke med svojimi argumenti.
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
Ali
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
V programu Bash raje uporabljajte [[[ ]]
, saj ta program ne izvaja deljenja besed in razširjanja imen poti na svoje spremenljivke, zato navajanje ni potrebno, razen če je del izraza.
[[ $# -ne 1 ]]
Ima tudi nekatere druge funkcije, kot so grupiranje pogojev brez citatov, ujemanje vzorcev (razširjeno ujemanje vzorcev z extglob
) in ujemanje regex.
Naslednji primer preveri, ali so argumenti veljavni. Dovoljen je en sam argument ali dva.
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
Za čiste aritmetične izraze je uporaba (( ))
za nekatere morda še vedno boljša, vendar so še vedno mogoči v [[ ]]
z njegovimi aritmetičnimi operatorji, kot so -eq
, -ne
, -lt
, -le
, -gt
ali -ge
, tako da izraz postavimo kot en sam argument v obliki niza:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
To bi vam moralo biti v pomoč, če bi ga morali kombinirati tudi z drugimi funkcijami [[[ ]]
.
Prav tako je logično, da se skripta zaključi, če so ji posredovani neveljavni parametri. To je v komentarjih že predlagal ekangas, vendar je nekdo uredil ta odgovor, da je bila vrnjena vrednost -1
, zato bi to lahko tudi jaz naredil pravilno.
Čeprav -1
sprejme Bash kot argument za exit
, to ni izrecno dokumentirano in ni prav, da se uporablja kot običajen predlog. 64
je tudi najbolj formalna vrednost, saj je opredeljena v sysexits.h
z #definine EX_USAGE 64 /* napaka pri uporabi ukazne vrstice */``. Večina orodij, kot je
ls, vrne tudi
2pri neveljavnih argumentih. Tudi sam sem v svojih skriptih včasih vračal
2, vendar me v zadnjem času to ni več zanimalo in sem preprosto uporabljal
1pri vseh napakah. Vendar naj
2` navedemo tukaj, saj je najpogostejši in verjetno ni specifičen za operacijski sistem.
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters"
exit 2
fi
Če imate opravka s številkami, je morda dobro uporabiti aritmetične izraze.
if (( $# != 1 )); then
echo "Illegal number of parameters"
fi