Saya menemukan skrip yang memiliki fungsi yang memeriksa apakah suatu variabel diset tetapi saya tidak memahaminya dengan baik.
check_if_variable_is_set() {
var_name=$1
if [ -z "${!var_name+x}" ]; then
false
else
true
fi
}
Apa yang sebenarnya terjadi dengan penggantian ini?
bash
shell-script
variable-substitution
Karim Manaouil
sumber
sumber
Jawaban:
Dalam
bash
shell,${!var}
adalah tipuan variabel. Itu memperluas ke nilai variabel yang namanya disimpan$var
.Ekspansi variabel
${var+value}
adalah ekspansi POSIX yang berkembang kevalue
jika variabelvar
diatur (tidak peduli apakah nilainya kosong atau tidak).Menggabungkan ini,
${!var+x}
akan diperluas kex
jika variabel yang namanya disimpan$var
diatur.Contoh:
(baris kosong sebagai output)
Fungsi dalam pertanyaan dapat disingkat menjadi
atau bahkan:
atau bahkan:
Di mana
-v
adalahbash
tes pada nama variabel yang akan menjadi kenyataan jika variabel bernama diatur, dan false jika tidak.POSIXly, itu bisa ditulis:
Perhatikan bahwa semua itu adalah potensi kerentanan injeksi perintah jika argumen pada fungsi itu bisa berakhir di bawah kendali seorang penyerang. Coba misalnya dengan
check_if_variable_is_set 'a[$(id>&2)]'
.Untuk mencegah hal itu, Anda mungkin ingin memverifikasi bahwa argumen adalah nama variabel yang valid terlebih dahulu. Untuk variabel:
(catatan yang
[[:alpha:]]
akan memeriksa karakter alfabet di lokal Anda sementara beberapa shell hanya menerima karakter alfabet dari karakter portabel yang diatur dalam variabel mereka)sumber