Norėčiau, kad mano "Bash" skriptas spausdintų klaidos pranešimą, jei nesilaikoma reikalaujamo argumentų skaičiaus.
Išbandžiau tokį kodą:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Dėl nežinomos priežasties gavau tokią klaidą:
test: line 4: [2: command not found
Ką darau ne taip?
Kaip ir bet kuri kita paprasta komanda, [ ... ]
arba test
tarp argumentų turi būti tarpai.
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
Arba
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
Kai naudojate Bash, verčiau naudokite [[[ ]]
, nes jis neatlieka žodžių skaidymo ir kelio vardo plėtojimo savo kintamiesiems, todėl citavimas gali būti nereikalingas, nebent tai būtų išraiškos dalis.
[[ $# -ne 1 ]]
Ji taip pat turi keletą kitų funkcijų, pavyzdžiui, neužrašytų sąlygų grupavimą, šablonų atitikimą (išplėstinį šablonų atitikimą su extglob
) ir regex atitikimą.
Toliau pateiktame pavyzdyje tikrinama, ar argumentai galioja. Galima naudoti vieną arba du argumentus.
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
Grynai aritmetinėms išraiškoms kai kurioms vis dar geriau naudoti ((( ))
, tačiau jas vis dar galima naudoti [[ ]]
su jo aritmetiniais operatoriais, tokiais kaip -eq
, -ne
, -lt
, -le
, -gt
arba -ge
, pateikus išraišką kaip vieną eilutės argumentą:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
Tai turėtų būti naudinga, jei jums reikėtų jį derinti ir su kitomis [[ ]]
funkcijomis.
Taip pat logiška, kad scenarijus išeitų, kai jam perduodami negaliojantys parametrai. Tai jau buvo pasiūlyta komentaruose ekangas, bet kažkas redagavo šį atsakymą, kad jis būtų su -1
kaip grąžinama verte, todėl galėčiau tai padaryti teisingai.
-1
, nors ir priimamas Bash kaip exit
argumentas, nėra aiškiai dokumentuotas ir nėra teisinga jį naudoti kaip bendrą pasiūlymą. 64
taip pat yra oficialiausia reikšmė, nes ji apibrėžta sysexits.h
su #define EX_USAGE 64 /* komandinės eilutės naudojimo klaida */``. Dauguma įrankių, tokių kaip
ls, taip pat grąžina
2, jei argumentai yra neteisingi. Aš savo scenarijuose taip pat grąžindavau
2, bet pastaruoju metu man tai nebelabai rūpėjo ir visose klaidose tiesiog naudojau
1. Tačiau čia tiesiog įrašykime
2`, nes ji yra labiausiai paplitusi ir tikriausiai nesusijusi su operacine sistema.
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters"
exit 2
fi
Jei dirbate su skaičiais, vertėtų naudoti aritmetines išraiškas.
if (( $# != 1 )); then
echo "Illegal number of parameters"
fi