Cara menemukan apakah variabel kosong di Bash

262

Bagaimana saya bisa memeriksa apakah suatu variabel kosong di Bash?

Pohon
sumber
2
Yang jenis script shell? * nix?
TJ Crowder
8
skrip bash shell
Pohon
serverfault.com/questions/7503/...
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功 法轮功

Jawaban:

383

Di Bash setidaknya perintah berikut akan menguji apakah $ var kosong :

if [[ -z "$var" ]]; then
   # Do what you want
fi

Perintahnya man testadalah temanmu.

Jay
sumber
62
kurung ganda tidak berguna di sini. mungkin sederhana [-z "$ var"] atau bahkan lebih mudah jika menguji -z "var" .. pokoknya +1 :)
Luca Borrione
2
kurung kotak ganda tidak berguna, jika saya tidak mencantumkan saya tidak mendapatkan ./test.ksh[8]: test: argument expectedalasan tapi braket tunggal tidak berfungsi tetapi yang ganda memilikinya.
gahlot.jaggs
8
@LucaBorrione Saya pikir maksud Anda if test -z "$var", bukan?
neu242
1
Hanya komentar tambahan untuk situasi tertentu yang tidak secara langsung disebutkan dalam pertanyaan: jika variabel tidak disetel dan set -uopsi telah diaktifkan, tes ini akan gagal unbound variable. Dalam hal ini, Anda mungkin lebih suka solusi @ alexli.
anol
3
@LucaBorrione Seperti halnya catatan tambahan: "[[" dapat dilihat sebagai "tidak pernah sia-sia"; karena menggunakan "[[" memiliki beberapa kelebihan dibandingkan "[" (lihat stackoverflow.com/questions/669452/... misalnya)
GhostCat
107

Menganggap Bash:

var=""

if [ -n "$var" ]; then
    echo "not empty"
else
    echo "empty"
fi
ChristopheD
sumber
9
Jawaban yang lebih langsung adalah -z:[[ -z "$an_unset_or_empty_var" ]] && echo empty
glenn jackman
4
@glenn jackman: komentar baik; memang benar itu -zlebih dekat dengan apa yang diminta. Jay telah memasukkan ini ke dalam jawabannya, jadi saya akan menahan diri untuk tidak memperbarui milik saya dan membiarkannya seperti ini.
ChristopheD
48

Saya juga sudah melihat

if [ "x$variable" = "x" ]; then ...

yang jelas sangat kuat dan shell independen.

Juga, ada perbedaan antara "kosong" dan "tidak disetel". Lihat Cara mengetahui apakah string tidak didefinisikan dalam skrip Bash shell .

Daniel Andersson
sumber
Terlihat aneh bagiku. Bisakah Anda jelaskan solusi ini? Terima kasih.
guettli
2
@guettli: Jika $variablekosong, maka string di sebelah kiri operator perbandingan menjadi hanya x, yang kemudian sama dengan string di sebelah kanan operator. [ x = x ]adalah "benar", jadi dalam praktiknya tes $variableini kosong atau tidak. Sebagai tambahan (3½ tahun setelah fakta :-)) Saya tidak akan pernah menggunakan ini sendiri karena -zmelakukan apa yang mungkin saya inginkan dengan cara yang lebih jelas, tetapi saya ingin menambahkan jawaban ini karena metode ini sering terlihat "di alam liar"; mungkin ditulis dengan cara ini dengan sengaja oleh orang-orang yang memiliki pengalaman berbeda dari saya.
Daniel Andersson
30
if [ ${foo:+1} ]
then
    echo "yes"
fi

mencetak yesjika variabel diatur. ${foo:+1}akan mengembalikan 1 ketika variabel diatur, jika tidak maka akan mengembalikan string kosong.

alexli
sumber
2
Meskipun tidak disebutkan dalam pertanyaan, keuntungan penting dari jawaban ini adalah bahwa ia berfungsi bahkan ketika variabel tidak ditentukan dan set -uopsi ( nounset) diaktifkan. Hampir semua jawaban lain untuk pertanyaan ini akan gagal unbound variabledalam kasus ini.
anol
Ini :+notasi juga berguna untuk situasi di mana Anda memiliki parameter baris perintah opsional yang Anda telah ditentukan dengan variabel opsional. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
Alan Porter
10
if [[ "$variable" == "" ]] ...
Amardeep AC9MF
sumber
10
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
pixelbeat
sumber
Cara yang bagus untuk keluar dari var, plus 1
ehime
@ehime untuk membuat nilai default yang akan Anda gunakan${variable:-default_value}
warvariuc
Ini adalah cara cepat untuk memeriksa validitas entri variabel dan keluar jika tidak disetel: [ "$variable" ] || exit
Marcel Sonderegger
8

Ini akan kembali truejika variabel tidak disetel atau disetel ke string kosong ("").

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
3kstc
sumber
3
Mengapa Anda menggunakan elif !bukan else?
ZiggyTheHamster
1
Hanya untuk membuat perbedaan antara dua pernyataan, yaitu menggunakan ! [ -z "$MyVar" ]akan berarti bahwa variabel tersebut akan memiliki sesuatu di dalamnya. Tapi idealnya orang akan menggunakannya else.
3kstc
6

The Pertanyaan meminta bagaimana untuk memeriksa apakah suatu variabel string kosong dan jawaban terbaik sudah diberikan untuk itu.

Tapi saya mendarat di sini setelah beberapa waktu berlalu pemrograman dalam PHP, dan saya benar-benar mencari cek seperti fungsi kosong di PHP yang bekerja di shell Bash.

Setelah membaca jawaban saya menyadari saya tidak berpikir dengan benar di Bash, tapi bagaimanapun pada saat itu fungsi seperti kosong di PHP akan sangat berguna dalam kode Bash saya.

Karena saya pikir ini bisa terjadi pada orang lain, saya memutuskan untuk mengonversi fungsi PHP kosong di Bash.

Menurut manual PHP :

variabel dianggap kosong jika tidak ada atau nilainya salah satu dari yang berikut:

  • "" (string kosong)
  • 0 (0 sebagai bilangan bulat)
  • 0,0 (0 sebagai pelampung)
  • "0" (0 sebagai string)
  • sebuah array kosong
  • variabel dideklarasikan, tetapi tanpa nilai

Tentu saja kasus null dan false tidak dapat dikonversi dalam bash, sehingga dihilangkan.

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 "" ) ]]
}



Contoh penggunaan:

if empty "${var}"
    then
        echo "empty"
    else
        echo "not empty"
fi



Demo:
Cuplikan berikut:

#!/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

output:

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

Setelah mengatakan bahwa dalam logika Bash, cek pada nol pada fungsi ini dapat menyebabkan masalah samping, siapa pun yang menggunakan fungsi ini harus mengevaluasi risiko ini dan mungkin memutuskan untuk memotong cek-cek itu hanya menyisakan yang pertama.

Luca Borrione
sumber
2

Anda mungkin ingin membedakan antara variabel yang tidak disetel dan variabel yang ditetapkan dan kosong:

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

Hasil:

set and non-empty
set and empty
unset

BTW, saya sarankan menggunakan set -uyang akan menyebabkan kesalahan saat membaca variabel yang tidak disetel, ini dapat menyelamatkan Anda dari bencana seperti

rm -rf $dir

Anda dapat membaca tentang ini dan praktik terbaik lainnya untuk "mode ketat" di sini .

suram
sumber
Terima kasih untuk referensi mode yang ketat!
paulcm
1

Untuk memeriksa apakah variabel v tidak disetel

if [ "$v" == "" ]; then
   echo "v not set"
fi
smishra
sumber