Saya perlu memeriksa keberadaan variabel dalam sebuah if
pernyataan. Sesuatu untuk efek:
if [ -v $somevar ]
then
echo "Variable somevar exists!"
else
echo "Variable somevar does not exist!"
Dan pertanyaan terdekatnya adalah ini , yang sebenarnya tidak menjawab pertanyaan saya.
$somevar
ke nilai / string jika variabel tidak ada:${somevar:=42}
.[ -n "$var" ]
atau[ ! -z "$var" ]
). Saya pikir pemeriksaan keberadaan / tidak ada terlalu halus, dan saya lebih suka kode saya kasar dan sederhana.[ -n "$var" ]
? Terkait: stackoverflow.com/questions/3601515/…Jawaban:
Dalam bash modern (versi 4.2 dan di atasnya):
Dari
help test
:sumber
[ -v name_of_var ]
.$1
,$-
,$#
...test
atau[
; Ini tidak tersedia di/usr/bin/test
. Bandingkanman test
denganhelp test
.Tergantung apa yang Anda maksud dengan yang ada .
Apakah variabel yang telah dideklarasikan tetapi tidak ditugaskan ada ?
Apakah variabel array (atau hash) yang telah ditetapkan daftar kosong ada ?
Apakah variabel nameref menunjuk ke variabel yang saat ini tidak ditetapkan ada ?
Apakah Anda menganggap
$-
,$#
,$1
variabel? (POSIX tidak).Dalam cangkang mirip Bourne, cara kanonik adalah:
Itu berfungsi untuk variabel skalar dan parameter lain untuk mengetahui apakah suatu variabel telah diberi nilai (kosong atau tidak, secara otomatis, dari lingkungan, tugas
read
,for
atau lainnya).Untuk shell yang memiliki perintah
typeset
ataudeclare
, yang tidak akan melaporkan set variabel yang telah dideklarasikan tetapi tidak ditugaskan kecuali dizsh
.Untuk shell yang mendukung array, kecuali
yash
danzsh
yang tidak akan dilaporkan sebagai variabel array set kecuali elemen indice 0 telah ditetapkan.Untuk
bash
(tetapi tidakksh93
jugazsh
), untuk variabel array asosiatif tipe , itu tidak akan melaporkannya sebagai set kecuali elemen mereka dari kunci "0" telah ditetapkan.Untuk
ksh93
danbash
, untuk variabel tipe nameref , itu hanya mengembalikan true jika variabel yang direferensikan oleh nameref itu sendiri dianggap ditetapkan .Untuk
ksh
,zsh
danbash
, pendekatan yang berpotensi lebih baik adalah:Untuk
ksh93
,zsh
danbash
4.4 atau lebih, ada juga:Yang akan melaporkan variabel yang telah ditetapkan atau dideklarasikan.
sumber
declare -p
Sayatypeset -p
bekerja dibash
sekarang juga.bash -c 'typeset -i a; typeset -p a'
dan bandingkan denganksh93
atauzsh
.Seperti yang disebutkan dalam jawaban pada SO , berikut adalah cara untuk memeriksa:
di mana $ {somevar + x} adalah ekspansi parameter yang mengevaluasi ke nol jika var tidak disetel dan menggantikan string "x" sebaliknya.
Menggunakan
-n
, seperti yang disarankan oleh jawaban lain, hanya akan memeriksa apakah variabel berisi string kosong. Itu tidak akan memeriksa keberadaannya.sumber
$somevar
untuk menanganiIFS=x
. Entah itu atau mengutipx
.if [ -z "${somevar+x}" ]
? Apakah kutipan masih diperlukan di dalam[[
dan]]
?[ test
rutin menerima parameter baris perintah, sehingga ekspansi biasa dan interpretasi seperti yang diperintahkan dalam cara yang biasa harus diandalkan untuk membuat di doa dari tes yang diterapkan apa yang harus Anda menyebabkan untuk dibaca demikian oleh setiap baris perintah program yang. test {! + "!"}set -u
sedang berlaku dan versi Bash adalah pra-4.2.POSIXly:
atau Anda dapat membiarkan shell Anda menampilkan pesan untuk Anda:
sumber
trap
hanya dapat bekerja pada EXIT. Itu yang saya katakan - itu hanya tidak berlaku sebagai lulus / gagal dengan sangat baik. Dan ini juga bukan saya yang berbicara - saya sudah melakukan ini sebelumnya dan butuh sedikit komentar obrolan seperti ini untuk meyakinkan saya. Jadi, saya pikir saya akan membayarnya.sumber
sh
kompatibel, yang memang saya butuhkan.... tidak akan mencetak apa pun ketika tidak ada. Atau...
... akan memberitahumu juga.
Anda dapat menggunakan nilai pengembalian tes untuk secara dinamis memperluas ke string format yang sesuai untuk kondisi Anda:
Anda juga dapat membuat
printf
kegagalan berdasarkan substitusi ...... yang mencetak
$var does not exist!
ke stderr dan mengembalikan selain 0 ketika$var
tidak disetel, tetapi mencetak$var does exist!
ke stdout dan mengembalikan 0 saat$var
diatur.sumber
Baris sederhana ini berfungsi (dan bekerja pada sebagian besar shell POSIX):
Atau, ditulis dalam bentuk yang lebih panjang:
Ekspansi adalah:
The
${var+"false"}
ekspansi memperluas baik "nol" dari "false".Kemudian, "tidak ada" atau "salah" dijalankan, dan kode keluar ditetapkan.
Tidak perlu memanggil perintah
test
([
atau[[
) karena nilai keluar diatur oleh (pelaksanaan) ekspansi itu sendiri.sumber
$IFS
berisi f, a, l, s atau e. Seperti untuk jawaban lain, ada kasus array, hash, atau jenis variabel lain yang mungkin ingin disebutkan.most POSIX shells
.most
artinyaIn the greatest number of instances
tidak semua. ... ... Jadi, ya, dalam kondisi yang tidak jelaswhen $IFS contains f, a, l, s or e
dan untuk beberapa shell yang tidak jelassome old versions of zsh
ini gagal: Sungguh mengejutkan !. Saya harus berasumsi bahwa bug tersebut telah dipecahkan sejak lama. ... ... Apakah Anda mengusulkan agar kami harus menulis kode untuk kerang yang sudah lama rusak ?.Cara shell murni:
Skrip uji:
Hasil:
sumber
Dengan bash 4.4.19 berikut ini bekerja untuk saya. Ini adalah contoh lengkapnya
sumber
Anda tidak dapat menggunakan
if
perintah untuk memeriksa keberadaan variabel yang dideklarasikan dalam bash namun-v
opsi ada di bash yang lebih baru, tetapi tidak portabel dan Anda tidak dapat menggunakannya dalambash
versi yang lebih lama . Karena ketika Anda menggunakan variabel jika tidak ada itu akan lahir pada saat yang sama.Misalnya Bayangkan bahwa saya tidak menggunakan atau menetapkan nilai ke
MYTEST
variabel, tetapi ketika Anda menggunakan perintah gema itu tidak menunjukkan apa-apa! Atau jika Anda menggunakannyaif [ -z $MYTEST ]
mengembalikan nilai nol! Itu tidak mengembalikan status keluar lain, yang memberitahu Anda bahwa variabel ini tidak ada!Sekarang Anda memiliki dua solusi (Tanpa
-v
opsi):declare
perintah.set
perintah.Sebagai contoh:
Namun sayangnya perintah ini menunjukkan Anda memuat fungsi dalam memori juga! Anda dapat menggunakan
declare -p | grep -q MYTEST ; echo $?
perintah untuk hasil yang lebih bersih.sumber
Berfungsi untuk memeriksa apakah variabel dinyatakan / tidak disetel
termasuk kosong
$array=()
Selain jawaban @ Gilles
- yang saya tidak menemukan cara untuk untuk merangkum itu dalam fungsi - Saya ingin menambahkan versi sederhana, yang sebagian didasarkan pada Richard Hansen 's jawaban , tetapi tidak alamat juga perangkap yang terjadi dengan kosong
array=()
:$1
berisi nama yang kosong$array=()
, panggilan untuk menyatakan akan memastikan kami mendapatkan hasil yang benarDengan kode berikut fungsinya dapat diuji:
Script harus dikembalikan
sumber
fungsi bash yang berfungsi untuk tipe skalar dan array :
definisi
doa
sumber