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)
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.
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.
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}
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.
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 passedif test -z "$var"then[[ $( echo "1")]]return# Return true if var is zero (0 as an integer or "0" as a string)elif["$var"==02>/dev/null ]then[[ $( echo "1")]]return# Return true if var is 0.0 (0 as a float)elif["$var"==0.02>/dev/null ]then[[ $( echo "1")]]returnfi[[ $( echo "")]]}
Contoh penggunaan:
if empty "${var}"then
echo "empty"else
echo "not empty"fi
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.
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 .
Jawaban:
Di Bash setidaknya perintah berikut akan menguji apakah $ var kosong :
Perintahnya
man test
adalah temanmu.sumber
./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 gagalunbound variable
. Dalam hal ini, Anda mungkin lebih suka solusi @ alexli.Menganggap Bash:
sumber
-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
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 .
sumber
$variable
kosong, maka string di sebelah kiri operator perbandingan menjadi hanyax
, 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.mencetak
yes
jika variabel diatur.${foo:+1}
akan mengembalikan 1 ketika variabel diatur, jika tidak maka akan mengembalikan string kosong.sumber
set -u
opsi (nounset
) diaktifkan. Hampir semua jawaban lain untuk pertanyaan ini akan gagalunbound 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}
sumber
sumber
${variable:-default_value}
[ "$variable" ] || exit
Ini akan kembali
true
jika variabel tidak disetel atau disetel ke string kosong ("").sumber
elif !
bukanelse
?! [ -z "$MyVar" ]
akan berarti bahwa variabel tersebut akan memiliki sesuatu di dalamnya. Tapi idealnya orang akan menggunakannyaelse
.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.
Contoh penggunaan:
Demo:
Cuplikan berikut:
output:
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.
sumber
Anda mungkin ingin membedakan antara variabel yang tidak disetel dan variabel yang ditetapkan dan kosong:
Hasil:
BTW, saya sarankan menggunakan
set -u
yang akan menyebabkan kesalahan saat membaca variabel yang tidak disetel, ini dapat menyelamatkan Anda dari bencana sepertiAnda dapat membaca tentang ini dan praktik terbaik lainnya untuk "mode ketat" di sini .
sumber
Untuk memeriksa apakah variabel v tidak disetel
sumber