Come posso verificare se una variabile è vuota in Bash?
Come posso verificare se una variabile è vuota in Bash?
Risposte:
In Bash almeno il seguente comando verifica se $ var è vuoto :
if [[ -z "$var" ]]; then
# Do what you want
fi
Il comando man test
è tuo amico.
./test.ksh[8]: test: argument expected
capire il motivo ma la parentesi singola non ha funzionato ma quella doppia aveva.
if test -z "$var"
, vero?
set -u
opzione è stata attivata, questo test fallirà unbound variable
. In questo caso, potresti preferire la soluzione di @ alexli.
Presumo Bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
-z
:[[ -z "$an_unset_or_empty_var" ]] && echo empty
-z
è più vicino a ciò che è stato chiesto. Jay ha inserito questo nella sua risposta, quindi mi asterrò dall'aggiornamento del mio e lo lascerò così com'è.
Ho anche visto
if [ "x$variable" = "x" ]; then ...
che è ovviamente molto robusto e indipendente dalla shell.
Inoltre, c'è una differenza tra "vuoto" e "non impostato". Vedi Come capire se una stringa non è definita in uno script della shell Bash .
$variable
è vuoto, la stringa a sinistra dell'operatore di confronto diventa solo x
, che è quindi uguale alla stringa a destra dell'operatore. [ x = x ]
è "vero", quindi in pratica questo verifica se $variable
è vuoto o meno. Come aggiunta (3 anni e mezzo dopo il fatto :-)) non lo userei mai da solo poiché -z
fa quello che probabilmente voglio in modo più chiaro, ma ho voluto aggiungere questa risposta poiché questo metodo è spesso visto "in natura"; forse scritto in questo modo apposta da persone che hanno avuto esperienze diverse da me.
if [ ${foo:+1} ]
then
echo "yes"
fi
stampa yes
se la variabile è impostata. ${foo:+1}
restituirà 1 quando la variabile è impostata, altrimenti restituirà una stringa vuota.
set -u
opzione ( nounset
) è attivata. Quasi tutte le altre risposte a questa domanda falliranno unbound variable
in questo caso.
:+
notazione è utile anche per le situazioni in cui sono presenti parametri della riga di comando facoltativi che sono stati specificati con variabili opzionali. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
${variable:-default_value}
[ "$variable" ] || exit
Questo restituirà true
se una variabile non è impostata o è impostata sulla stringa vuota ("").
if [ -z "$MyVar" ]
then
echo "The variable MyVar has nothing in it."
elif ! [ -z "$MyVar" ]
then
echo "The variable MyVar has something in it."
fi
elif !
invece di else
?
! [ -z "$MyVar" ]
significherebbe che la variabile potrebbe avere qualcosa in esso. Ma idealmente si dovrebbe usare else
.
La domanda chiede come verificare se una variabile è una stringa vuota e per questo sono già state fornite le risposte migliori.
Ma sono atterrato qui dopo un periodo trascorso programmando in PHP, e in realtà stavo cercando un assegno come la funzione vuota in PHP che funziona in una shell Bash.
Dopo aver letto le risposte mi sono reso conto che non stavo pensando correttamente in Bash, ma comunque in quel momento una funzione come vuota in PHP sarebbe stata davvero utile nel mio codice Bash.
Dato che penso che ciò possa accadere ad altri, ho deciso di convertire la funzione vuota PHP in Bash.
Secondo il manuale di PHP :
una variabile è considerata vuota se non esiste o se il suo valore è uno dei seguenti:
Naturalmente i casi null e false non possono essere convertiti in bash, quindi vengono omessi.
function empty
{
local var="$1"
# Return true if:
# 1. var is a null string ("" as empty string)
# 2. a non set variable is passed
# 3. a declared variable or array but without a value is passed
# 4. an empty array is passed
if test -z "$var"
then
[[ $( echo "1" ) ]]
return
# Return true if var is zero (0 as an integer or "0" as a string)
elif [ "$var" == 0 2> /dev/null ]
then
[[ $( echo "1" ) ]]
return
# Return true if var is 0.0 (0 as a float)
elif [ "$var" == 0.0 2> /dev/null ]
then
[[ $( echo "1" ) ]]
return
fi
[[ $( echo "" ) ]]
}
Esempio di utilizzo:
if empty "${var}"
then
echo "empty"
else
echo "not empty"
fi
Demo:
il seguente frammento:
#!/bin/bash
vars=(
""
0
0.0
"0"
1
"string"
" "
)
for (( i=0; i<${#vars[@]}; i++ ))
do
var="${vars[$i]}"
if empty "${var}"
then
what="empty"
else
what="not empty"
fi
echo "VAR \"$var\" is $what"
done
exit
uscite:
VAR "" is empty
VAR "0" is empty
VAR "0.0" is empty
VAR "0" is empty
VAR "1" is not empty
VAR "string" is not empty
VAR " " is not empty
Detto che in una logica di Bash i controlli su zero in questa funzione possono causare problemi collaterali, chiunque usi questa funzione dovrebbe valutare questo rischio e forse decidere di tagliare quei controlli lasciando solo il primo.
Potresti voler distinguere tra variabili non impostate e variabili che sono impostate e vuote:
is_empty() {
local var_name="$1"
local var_value="${!var_name}"
if [[ -v "$var_name" ]]; then
if [[ -n "$var_value" ]]; then
echo "set and non-empty"
else
echo "set and empty"
fi
else
echo "unset"
fi
}
str="foo"
empty=""
is_empty str
is_empty empty
is_empty none
Risultato:
set and non-empty
set and empty
unset
A proposito, ti consiglio di utilizzare set -u
che causerà un errore durante la lettura di variabili non impostate, questo può salvarti da disastri come
rm -rf $dir
Puoi leggere questa e altre best practice per una "modalità rigorosa" qui .