Come si controlla se $*
è vuoto? In altre parole, come verificare se non sono stati forniti argomenti per un comando?
Come si controlla se $*
è vuoto? In altre parole, come verificare se non sono stati forniti argomenti per un comando?
Risposte:
Per verificare se non sono stati forniti argomenti per il comando, controllare il valore della $#
variabile quindi,
if [ $# -eq 0 ]; then
echo "No arguments provided"
exit 1
fi
Se si desidera utilizzare $*
( non preferibile ),
if [ "$*" == "" ]; then
echo "No arguments provided"
exit 1
fi
Qualche spiegazione:
Il secondo approccio non è preferibile perché nell'espansione dei parametri posizionali si *
espande ai parametri posizionali, a partire da uno. Quando l'espansione avviene tra virgolette doppie, si espande in una singola parola con il valore di ciascun parametro separato dal primo carattere della variabile speciale IFS. Ciò significa che viene costruita una stringa. Quindi c'è un sovraccarico extra.
D'altra parte si #
espande al numero di parametri posizionali.
Esempio:
$ command param1 param2
Qui,
Il valore di $#
è 2 e il valore di $*
è la stringa "param1 param2" (senza virgolette), se IFS non è impostato. Perché se IFS non è impostato, i parametri sono separati da spazi
Per ulteriori dettagli man bash
e leggere l'argomento denominato Parametri speciali
[ $# -eq 0 ]
è la forma più comune IME. Esistono casi limite in cui "$#"
può essere vuoto: se c'è un singolo argomento che è vuoto o se ci sono diversi argomenti vuoti ed $IFS
è vuoto.
"$*"
espressione valuterà anche ""
se è ""
stato passato un solo parametro. Ma la maggior parte delle volte probabilmente non ti interesserà comunque.
bash
. Stai usando sh
per eseguire lo script. AFAIK ==
è valido solo in bash
.
Se sei interessato al salvataggio solo se manca un argomento particolare, la sostituzione dei parametri è ottima:
#!/bin/bash
# usage-message.sh
: ${1?"Usage: $0 ARGUMENT"}
# Script exits here if command-line parameter absent,
#+ with following error message.
# usage-message.sh: 1: Usage: usage-message.sh ARGUMENT
questo è uno dei modi in cui puoi sapere di non avere argomenti
NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
{do something}
fi
if ! (($#)); ...
, oppureif (($# == 0)); ...
, oppureif [ $# -eq 0 ]; ...
, oppure! (($#)) && ...
, oppure(($#)) || ...