Jag vill att mitt Bash-skript ska skriva ut ett felmeddelande om antalet nödvändiga argument inte är uppfyllt.
Jag försökte med följande kod:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Av någon okänd anledning har jag fått följande fel:
test: line 4: [2: command not found
Vad gör jag fel?
Precis som alla andra enkla kommandon kräver [ ... ]
eller test
mellanslag mellan argumenten.
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
Eller
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
När du använder Bash, föredrar du att använda [[[ ]]
istället eftersom det inte gör orddelning och expansion av sökvägar för sina variabler som kanske inte behöver citeras om det inte är en del av ett uttryck.
[[ $# -ne 1 ]]
Den har också en del andra funktioner, t.ex. gruppering av villkor utan anföringstecken, mönstermatchning (utökad mönstermatchning med extglob
) och regexmatchning.
Följande exempel kontrollerar om argumenten är giltiga. Det tillåter ett enda argument eller två.
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
För rena aritmetiska uttryck kan det fortfarande vara bättre att använda (( ))
för vissa, men de är fortfarande möjliga i [[ ]]
med dess aritmetiska operatörer som -eq
, -ne
, -lt
, -le
, -gt
eller -ge
genom att placera uttrycket som ett enda strängargument:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
Det borde vara till hjälp om du behöver kombinera det med andra funktioner i [[[ ]]
också.
Det är också logiskt att låta skriptet avslutas när ogiltiga parametrar skickas till det. Detta har redan föreslagits i comments av ekangas men någon redigerade detta svar för att få det med -1
som returnerat värde, så jag kan lika gärna göra det rätt.
Även om -1
accepteras av Bash som ett argument för exit
är det inte uttryckligen dokumenterat och det är inte rätt att använda det som ett vanligt förslag. 64
är också det mest formella värdet eftersom det är definierat i sysexits.h
med #define EX_USAGE 64 /* command line use error */
. De flesta verktyg som ls
returnerar också 2
vid ogiltiga argument. Jag brukade också returnera 2
i mina skript, men på senare tid har jag inte längre brytt mig om det och har helt enkelt använt 1
i alla fel. Men låt oss bara placera 2
här eftersom det är vanligast och förmodligen inte OS-specifikt.
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters"
exit 2
fi
Det kan vara en bra idé att använda [aritmetiska uttryck] (http://wiki.bash-hackers.org/syntax/arith_expr) om du har med siffror att göra.
if (( $# != 1 )); then
echo "Illegal number of parameters"
fi