Saya ingin memastikan bahwa pada titik tertentu skrip, setelah source
memasukkan file konfigurasi, beberapa variabel ditetapkan dan, jika tidak, untuk menghentikan eksekusi, memberi tahu pengguna tentang variabel yang hilang. saya telah mencoba
for var in $one $two $three ; do
...
tetapi jika misalnya $two
tidak disetel, loop tidak pernah dieksekusi untuk $two
. Hal berikutnya yang saya coba adalah
for var in one two three ; do
if [ -n ${!var} ] ; then
echo "$var is set to ${!var}"
else
echo "$var is not set"
fi
done
Tetapi jika dua tidak diatur, saya masih mendapatkan "dua diatur ke" bukannya "dua tidak diatur".
Bagaimana saya bisa memastikan bahwa semua variabel yang diperlukan ditetapkan?
Pembaruan / Solusi: Saya tahu bahwa ada perbedaan antara "set" dan "set, tetapi kosong". Saya sekarang menggunakan (terima kasih kepada /programming//a/16753536/3456281 dan jawaban untuk pertanyaan ini) berikut ini:
if [ -n "${!var:-}" ] ; then
jadi, jika var
disetel tetapi kosong, itu masih dianggap tidak valid.
sumber
set -u
ke awal skrip Anda untuk segera menghentikannya ketika variabel yang tidak disetel digunakan.Jawaban:
Mengutip kesalahan.
Untuk masa depan: Pengaturan
sebelum menjalankan kode akan menunjukkan Anda masalah. Alih-alih menambahkan itu ke kode Anda dapat memanggil skrip Anda dengan
sumber
set -- $(IFS=, ; echo $cs)
? Jenis orang yang harus bertanya di sini mengapaif [ -n ${!var} ] ; then
tidak bekerja? Mungkin tidak.Satu-satunya yang Anda butuhkan adalah kutipan dalam tes Anda:
Bekerja untukku.
sumber
Jika Anda ingin program berhenti:
Itu akan melakukan triknya. Setiap pesan setelah tanda tanya dicetak
stderr
dan shell induknya mati. Baiklah, jadi tidak setiap pesan - hanya satu - hanya pesan pertama yang gagal mencetak pesan yang menyebabkan shell mati. Saya suka menggunakan tes ini seperti ini:Saya punya banyak hal untuk dikatakan tentang ini di sini .
sumber
Kamu bisa menambahkan
ke awal skrip Anda untuk menghentikannya ketika mencoba menggunakan variabel yang tidak disetel.
Script seperti
akan menghasilkan
Jika Anda menggunakan
bash
sebagai gantinya, kesalahan akan terlihat seperti ini:sumber
set -u
mencegah persis jenis kesalahan OP mencoba untuk menghindari dan (bertentangan dengan semua solusi lain) tidak terbatas pada serangkaian variabel tertentu. Ini sebenarnya merupakan tindakan pencegahan yang berguna bagi hampir semua skrip shell untuk membuatnya gagal dengan aman daripada melakukan hal-hal yang tidak terduga ketika suatu variabel tidak disetel. Artikel ini adalah referensi praktis tentang topik ini.set -u
dapat digunakan juga saya pikir, tetapi tidak sefleksibel ekspansi parameter yang tepat (lihat pertanyaan saya yang diperbarui). Dan denganset -u
saya harus membuat dummy-akses ke semua variabel target jika saya ingin memeriksa keberadaan mereka di satu tempat.Sebuah solusi yang ramah maksimum menguji semua persyaratan, dan melaporkannya bersama-sama, daripada gagal pada yang pertama dan membutuhkan bolak-balik untuk memperbaiki keadaan:
Saya menggunakan variabel array untuk melacak variabel mana yang belum ditetapkan, dan menggunakan hasilnya untuk membuat pesan yang menghadap pengguna.
Catatan:
${required_vars[@]}
dalamfor
loop terutama karena kebiasaan - saya tidak akan menyarankan termasuk metacharacters shell dalam nama variabel Anda!${#missing_vars[@]}
, karena itu selalu bilangan bulat, bahkan jika Anda cukup sesat untuk mengabaikan saran sebelumnya.%q
saat mencetak;%s
biasanya akan cukup.>&2
, sehingga tidak bisa disalurkan ke perintah hilirsumber
bash
4.2 memungkinkan Anda menguji apakah suatu variabel diatur dengan-v
operator; variabel yang tidak disetel dan variabel yang disetel ke string kosong adalah dua kondisi yang berbeda:sumber
-v
mengambil nama dari variabel, sehinggafor var in one two three; [[ -v $var ]] && ...; done
akan memeriksa apakah masing-masingone
,two
danthree
diatur secara berurutan.Saya pikir jika Anda maksud
not set
, jadi variabel tidak boleh diinisialisasi. Jika Anda menggunakan[ -n "${!var}" ]
, jadi variabel yang kosong sepertitwo=""
akan gagal, sementara itu disetel . Anda dapat mencoba ini:sumber
Solusi ringkas (meskipun sedikit ruwet), untuk menangani kasus di mana tidak masalah bagi
source
skrip d untuk mengatur variabel ke nilai nol, adalah menginisialisasi variabel ke beberapa nilai khusus sebelum sumber skrip, dan kemudian memeriksa nilai itu setelah itu misalnyasumber
Saya telah memperpanjang jawaban @ mikeserv .
Versi ini mengambil daftar variabel untuk memeriksa keberadaan, mencetak nama variabel yang hilang dan memicu panggilan ke penggunaan () pada kesalahan.
Contoh output ketika nilai hilang:
Perhatikan bahwa Anda dapat mengubah variabel yang disebut VALUE ke nama alternatif yang lebih sesuai dengan output yang Anda inginkan.
sumber