Bagaimana saya bisa memeriksa apakah suatu variabel kosong di Bash?
Bagaimana saya bisa memeriksa apakah suatu variabel kosong di Bash?
Jawaban:
Di Bash setidaknya perintah berikut akan menguji apakah $ var kosong :
if [[ -z "$var" ]]; then
# Do what you want
fi
Perintahnya man test
adalah temanmu.
./test.ksh[8]: test: argument expected
alasan tapi braket tunggal tidak berfungsi tetapi yang ganda memilikinya.
if test -z "$var"
, bukan?
set -u
opsi telah diaktifkan, tes ini akan gagal unbound variable
. Dalam hal ini, Anda mungkin lebih suka solusi @ alexli.
Menganggap Bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
-z
:[[ -z "$an_unset_or_empty_var" ]] && echo empty
-z
lebih 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.
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 .
$variable
kosong, 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 $variable
ini kosong atau tidak. Sebagai tambahan (3½ tahun setelah fakta :-)) Saya tidak akan pernah menggunakan ini sendiri karena -z
melakukan 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.
if [ ${foo:+1} ]
then
echo "yes"
fi
mencetak yes
jika variabel diatur. ${foo:+1}
akan mengembalikan 1 ketika variabel diatur, jika tidak maka akan mengembalikan string kosong.
set -u
opsi ( nounset
) diaktifkan. Hampir semua jawaban lain untuk pertanyaan ini akan gagal unbound variable
dalam kasus 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}
if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
${variable:-default_value}
[ "$variable" ] || exit
Ini akan kembali true
jika 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
elif !
bukan else
?
! [ -z "$MyVar" ]
akan berarti bahwa variabel tersebut akan memiliki sesuatu di dalamnya. Tapi idealnya orang akan menggunakannya else
.
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:
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.
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 -u
yang 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 .