Preverjanje števila argumentov, posredovanih skripti Bash

Ž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?

Rešitev

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

Predlogi

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

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 [[[ ]].

Izhod iz skripte

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 jels, vrne tudi2pri neveljavnih argumentih. Tudi sam sem v svojih skriptih včasih vračal2, vendar me v zadnjem času to ni več zanimalo in sem preprosto uporabljal1pri vseh napakah. Vendar naj2` 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

Reference

Komentarji (2)

Če imate opravka s številkami, je morda dobro uporabiti aritmetične izraze.

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

Na []: !=, =, == ... so strunski primerjalni operatorji, -eq, -gt ... pa aritmetični binarni operatorji.

Uporabil bi:

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

Ali:

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