Patikrinkite "Bash" scenarijui perduotų argumentų skaičių

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?

Sprendimas

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

Pasiūlymai

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 == )) && $1 =~  ]]

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.

Išėjimas iš scenarijaus

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ų kaipls, taip pat grąžina2, jei argumentai yra neteisingi. Aš savo scenarijuose taip pat grąžindavau2, bet pastaruoju metu man tai nebelabai rūpėjo ir visose klaidose tiesiog naudojau1. Tačiau čia tiesiog įrašykime2`, nes ji yra labiausiai paplitusi ir tikriausiai nesusijusi su operacine sistema.

if [[ $# -ne 1 ]]; then
    echo "Illegal number of parameters"
    exit 2
fi

Nuorodos

Komentarai (2)

Jei dirbate su skaičiais, vertėtų naudoti aritmetines išraiškas.

if (( $# != 1 )); then
    echo "Illegal number of parameters"
fi
Komentarai (0)

Apie []: !=, =, == ... yra stringų palyginimo operatoriai, o -eq, -gt ... yra aritmetiniai dvejetainiai operatoriai.

Aš naudočiau:

if [ "$#" != "1" ]; then

Arba:

if [ $# -eq 1 ]; then
Komentarai (3)