Come scoprire se una variabile è vuota in Bash


262

Come posso verificare se una variabile è vuota in Bash?


2
Che tipo di script di shell? * nix?
TJ Crowder,

8
bash shell script
Tree



Risposte:


383

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.


62
le parentesi quadre doppie sono inutili qui. potrebbe essere semplice [-z "$ var"] o anche più semplice se test -z "var" .. comunque +1 :)
Luca Borrione

2
le parentesi quadre doppie non sono inutili, se non includo non riesco a ./test.ksh[8]: test: argument expectedcapire il motivo ma la parentesi singola non ha funzionato ma quella doppia aveva.
gahlot.jaggs

8
@LucaBorrione Penso che intendi if test -z "$var", vero?
neu242,

1
Solo un commento aggiunto per una situazione specifica non menzionata direttamente nella domanda: se la variabile non è impostata e l' set -uopzione è stata attivata, questo test fallirà unbound variable. In questo caso, potresti preferire la soluzione di @ alexli.
anol

3
@LucaBorrione Proprio come una nota laterale in ritardo: "[[" può essere visto come "mai inutile"; poiché l'utilizzo di "[[" presenta alcuni vantaggi rispetto a "[" (vedi stackoverflow.com/questions/669452/… per esempio)
GhostCat

107

Presumo Bash:

var=""

if [ -n "$var" ]; then
    echo "not empty"
else
    echo "empty"
fi

9
La risposta più diretta è -z:[[ -z "$an_unset_or_empty_var" ]] && echo empty
glenn jackman,

4
@glenn jackman: buon commento; è vero che -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'è.
ChristopheD,

48

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 .


Mi sembra strano. Potresti spiegare questa soluzione, per favore. Grazie.
Guettli,

2
@guettli: se $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é -zfa 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.
Daniel Andersson,

30
if [ ${foo:+1} ]
then
    echo "yes"
fi

stampa yesse la variabile è impostata. ${foo:+1}restituirà 1 quando la variabile è impostata, altrimenti restituirà una stringa vuota.


2
Sebbene non menzionato nella domanda, un importante vantaggio di questa risposta è che funziona anche quando la variabile non è definita e l' set -uopzione ( nounset) è attivata. Quasi tutte le altre risposte a questa domanda falliranno unbound variablein questo caso.
anol

Questa :+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}
Alan Porter,


10
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}

Ottimo modo per default fuori var, più 1
ehime

@ehime per creare un valore predefinito che ${variable:-default_value}
useresti

Questo è un modo rapido per verificare la validità di una voce di una variabile e uscire se non impostato: [ "$variable" ] || exit
Marcel Sonderegger

8

Questo restituirà truese 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

3
Perché dovresti usare elif !invece di else?
ZiggyTheHamster,

1
Giusto per fare una distinzione tra le due affermazioni, vale a dire utilizzando ! [ -z "$MyVar" ]significherebbe che la variabile potrebbe avere qualcosa in esso. Ma idealmente si dovrebbe usare else.
3kstc,

6

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:

  • "" (una stringa vuota)
  • 0 (0 come numero intero)
  • 0.0 (0 come float)
  • "0" (0 come stringa)
  • un array vuoto
  • una variabile dichiarata, ma senza un valore

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.


2

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 -uche 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 .


Grazie per il riferimento alla modalità rigorosa!
paulcm

1

Per verificare se la variabile v non è impostata

if [ "$v" == "" ]; then
   echo "v not set"
fi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.