Ik wil dat mijn Bash script een foutmelding geeft als het vereiste aantal argumenten niet wordt gehaald.
Ik heb de volgende code geprobeerd:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Om een onbekende reden krijg ik de volgende foutmelding:
test: line 4: [2: command not found
Wat doe ik verkeerd?
Net als elk ander eenvoudig commando, [ ... ]
of test
vereist spaties tussen de argumenten.
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
Of
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
Gebruik in Bash liever [[ ]]
omdat het geen woordsplitsing en padnaamuitbreiding doet voor zijn variabelen en quoten niet nodig is, tenzij het onderdeel is van een expressie.
[[ $# -ne 1 ]]
Het heeft ook enkele andere functies zoals unquoted condition grouping, pattern matching (extended pattern matching met extglob
) en regex matching.
Het volgende voorbeeld controleert of argumenten geldig zijn. Het staat een enkel argument of twee toe.
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
Voor pure rekenkundige uitdrukkingen is het gebruik van (( ))
voor sommigen misschien nog steeds beter, maar ze zijn nog steeds mogelijk in [[ ]]
met zijn rekenkundige operatoren zoals -eq
, -ne
, -lt
, -le
, -gt
, of -ge
door de uitdrukking als een enkel string argument te plaatsen:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
Dat zou handig moeten zijn als je het ook met andere functies van [[ ]]
zou moeten combineren.
Het is ook logisch om het script te laten afsluiten als er ongeldige parameters aan worden doorgegeven. Dit is al voorgesteld in de comments door ekangas maar iemand bewerkte dit antwoord om het met -1
als de geretourneerde waarde te hebben, dus ik kan het net zo goed goed goed goed doen.
-1
hoewel geaccepteerd door Bash als een argument voor exit
is niet expliciet gedocumenteerd en is niet juist om te worden gebruikt als een algemene suggestie. 64
is ook de meest formele waarde omdat het gedefinieerd is in sysexits.h
met #define EX_USAGE 64 /* command line usage error */
. De meeste programma's zoals ls
geven ook 2
terug bij ongeldige argumenten. Ik gaf vroeger ook 2
terug in mijn scripts, maar de laatste tijd kon het me niet meer echt schelen, en gebruikte ik gewoon 1
in alle fouten. Maar laten we 2
hier plaatsen omdat het het meest voorkomt en waarschijnlijk niet OS-specifiek is.
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters"
exit 2
fi
Het is misschien een goed idee om rekenkundige uitdrukkingen te gebruiken als je'met getallen te maken hebt.
if (( $# != 1 )); then
echo "Illegal number of parameters"
fi