Proprio come qualsiasi altro comando semplice [ ... ]o testrichiede spazi tra i suoi argomenti.
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
O
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
suggerimenti
Quando sei in Bash, preferisci usare [[ ]]invece come non fa la suddivisione delle parole e l'espansione del percorso alle sue variabili che la citazione potrebbe non essere necessaria a meno che non faccia parte di un'espressione.
[[ $# -ne 1 ]]
Ha anche alcune altre caratteristiche come il raggruppamento delle condizioni non quotate, la corrispondenza dei modelli (corrispondenza dei modelli estesa con extglob) e la corrispondenza regex.
L'esempio seguente verifica se gli argomenti sono validi. Permette un singolo argomento o due.
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
Per espressioni aritmetiche puri, utilizzando (( ))ad alcuni può essere ancora meglio, ma sono ancora possibili in [[ ]]con i suoi operatori aritmetici desiderate -eq, -ne, -lt, -le, -gt, oppure -geposizionando l'espressione come un singolo argomento stringa:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
Ciò dovrebbe essere utile se fosse necessario combinarlo con altre funzionalità di [[ ]].
Uscita dalla sceneggiatura
È inoltre logico uscire dallo script quando gli vengono passati parametri non validi. Questo è già stato suggerito nei commenti da ekangas ma qualcuno ha modificato questa risposta per averla -1come valore restituito, quindi potrei anche farlo bene.
-1sebbene accettato da Bash come argomento, exitnon è esplicitamente documentato e non è giusto usarlo come suggerimento comune. 64è anche il valore più formale poiché è definito sysexits.hcon #define EX_USAGE 64 /* command line usage error */. Molti strumenti come lsrestituiscono anche 2argomenti non validi. Ero anche abituato a tornare 2nei miei script, ma ultimamente non mi importava più molto, e semplicemente usavo 1tutti gli errori. Ma posizioniamoci 2qui poiché è più comune e probabilmente non specifico del sistema operativo.
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters"
exit 2
fi
Riferimenti
test. Questo è il nome di un comando Unix standard, non vorrai metterlo in ombra.