Saya memeriksanya dengan bash-4.4.0
:
#!/usr/bin/env bash
set -eu
check() {
if [[ ${array[@]} ]]; then
echo not empty
else
echo empty
fi
}
check # empty
array=(a b c d)
check # not empty
array=()
check # empty
dan bash-4.1.5
:
#!/usr/bin/env bash
set -eu
check() {
if [[ ${array[@]:+${array[@]}} ]]; then
echo non-empty
else
echo empty
fi
}
check # empty
array=(a b c d)
check # not empty
array=()
check # empty
Dalam kasus terakhir, Anda memerlukan konstruk berikut:
${array[@]:+${array[@]}}
agar tidak gagal pada array kosong atau tidak disetel. Itu jika Anda set -eu
suka saya biasanya. Ini memberikan pemeriksaan kesalahan yang lebih ketat. Dari dokumen :
-e
Segera keluar jika saluran pipa (lihat Saluran Pipa), yang dapat terdiri dari satu perintah sederhana (lihat Perintah Sederhana), daftar (lihat Daftar), atau perintah gabungan (lihat Perintah Gabungan) mengembalikan status bukan nol. Shell tidak keluar jika perintah yang gagal adalah bagian dari daftar perintah segera setelah beberapa saat atau sampai kata kunci, bagian dari pengujian dalam pernyataan if, bagian dari perintah yang dieksekusi dalam && atau || daftar kecuali perintah yang mengikuti akhir && atau ||, perintah apa pun dalam pipa kecuali yang terakhir, atau jika status pengembalian perintah sedang dibalik dengan! Jika perintah majemuk selain subshell mengembalikan status tidak nol karena perintah gagal saat -e diabaikan, shell tidak keluar. Jebakan pada ERR, jika diatur, dieksekusi sebelum shell keluar.
Opsi ini berlaku untuk lingkungan shell dan setiap lingkungan subkulit secara terpisah (lihat Lingkungan Eksekusi Perintah), dan dapat menyebabkan subkulit keluar sebelum menjalankan semua perintah dalam subkulit.
Jika perintah majemuk atau fungsi shell dieksekusi dalam konteks di mana -e diabaikan, tidak ada perintah yang dieksekusi dalam perintah majemuk atau fungsi tubuh akan terpengaruh oleh pengaturan -e, bahkan jika -e diatur dan perintah mengembalikan a status kegagalan. Jika perintah majemuk atau fungsi shell menyetel -e saat mengeksekusi dalam konteks di mana -e diabaikan, pengaturan itu tidak akan berpengaruh sampai perintah gabungan atau perintah yang berisi panggilan fungsi selesai.
-u
Perlakukan variabel dan parameter yang tidak disetel selain parameter khusus '@' atau '*' sebagai kesalahan saat melakukan ekspansi parameter. Pesan kesalahan akan ditulis ke kesalahan standar, dan shell non-interaktif akan keluar.
Jika Anda tidak membutuhkannya, jangan ragu untuk menghilangkan :+${array[@]}
bagiannya.
Perhatikan juga, bahwa penting untuk menggunakan [[
operator di sini, dengan [
Anda dapat:
$ cat 1.sh
#!/usr/bin/env bash
set -eu
array=(a b c d)
if [ "${array[@]}" ]; then
echo non-empty
else
echo empty
fi
$ ./1.sh
_/1.sh: line 4: [: too many arguments
empty
=
adalah operator string. Kebetulan berfungsi dengan baik dalam kasus ini, tetapi saya akan menggunakan operator aritmatika yang tepat-eq
sebagai gantinya (kalau-kalau saya ingin beralih ke-ge
atau-lt
, dll.).