Controleer het aantal argumenten dat is doorgegeven aan een Bash script

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?

Oplossing

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

Suggesties

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

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 script afsluiten

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

Referenties

Commentaren (2)

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
Commentaren (0)

Op []: !=, =, == ... zijn string vergelijkingsoperatoren en -eq, -gt ... zijn aritmetische binaire operatoren.

Ik zou gebruiken:

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

Of:

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