Vorrei che il mio script Bash stampasse un messaggio di errore se il numero di argomenti richiesto non è soddisfatto.
Ho provato il seguente codice:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Per qualche ragione sconosciuta ho ottenuto il seguente errore:
test: line 4: [2: command not found
Cosa sto facendo di sbagliato?
Proprio come qualsiasi altro semplice comando, [ ... ]
o test
richiede spazi tra i suoi argomenti.
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
Oppure
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
Quando in Bash, preferite usare [[ ]]
invece, dato che non fa la divisione delle parole e l'espansione del pathname alle sue variabili che il quoting potrebbe non essere necessario a meno che non sia parte di un'espressione.
Lingua: lang-none --
[[ $# -ne 1 ]]
Ha anche alcune altre caratteristiche come il raggruppamento delle condizioni senza virgolette, il pattern matching (pattern matching esteso con extglob
) e il regex matching.
L'esempio seguente controlla se gli argomenti sono validi. Permette un singolo argomento o due.
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
Per le espressioni aritmetiche pure, usare (( ))
per alcune può essere ancora meglio, ma sono ancora possibili in [[ ]]
con i suoi operatori aritmetici come -eq
, -ne
, -lt
, -le
, -gt
, o -ge
mettendo l'espressione come singolo argomento stringa:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
Questo dovrebbe essere utile se avete bisogno di combinarlo anche con altre caratteristiche di [[ ]]
.
È anche logico far uscire lo script quando gli vengono passati dei parametri non validi. Questo è già stato suggerito nei commenti da ekangas ma qualcuno ha modificato questa risposta per averlo con -1
come valore restituito, quindi potrei anche farlo bene.
-1
anche se accettato da Bash come argomento di exit
non è esplicitamente documentato e non è giusto essere usato come un suggerimento comune. 64
è anche il valore più formale poiché è definito in sysexits.h
con #define EX_USAGE 64 /* command line usage error */
. La maggior parte degli strumenti come ls
restituisce anche 2
su argomenti non validi. Anch'io ero solito restituire 2
nei miei script, ma ultimamente non mi interessava più, e ho semplicemente usato 1
in tutti gli errori. Ma mettiamo solo 2
qui, dato che è il più comune e probabilmente non specifico del sistema operativo.
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters"
exit 2
fi
Potrebbe essere una buona idea usare [espressioni aritmetiche] (http://wiki.bash-hackers.org/syntax/arith_expr) se avete a che fare con i numeri.
if (( $# != 1 )); then
echo "Illegal number of parameters"
fi