Saya telah melihat beberapa skrip yang ditulis orang lain (khususnya Red Hat), dan banyak variabel mereka ditugaskan menggunakan notasi berikut
VARIABLE1="${VARIABLE1:-some_val}"
atau beberapa memperluas variabel lain
VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"
Apa gunanya menggunakan notasi ini daripada hanya mendeklarasikan nilai secara langsung (misalnya, VARIABLE1=some_val
)?
Apakah ada manfaat dari notasi ini atau kemungkinan kesalahan yang akan dicegah?
Apakah :-
ada makna khusus dalam konteks ini?
bash
shell-script
scripting
variable
Rothgar
sumber
sumber
man bash
; cari blok "Ekspansi Parameter" (sekitar 28%). Tugas-tugas ini misalnya fungsi default: "Gunakan nilai default hanya jika belum ada yang ditetapkan."Jawaban:
Teknik ini memungkinkan suatu variabel diberi nilai jika variabel lain kosong atau tidak terdefinisi. CATATAN: "variabel lain" ini bisa sama atau variabel lain.
kutipan
CATATAN: Formulir ini juga berfungsi
${parameter-word}
,. Jika Anda ingin melihat daftar lengkap semua bentuk ekspansi parameter yang tersedia dalam Bash maka saya sangat menyarankan Anda melihat topik ini di wiki Bash Hacker berjudul: " Ekspansi parameter ".Contohnya
variabel tidak ada variabel adaHal yang sama dapat dilakukan dengan mengevaluasi variabel lain, atau menjalankan perintah dalam bagian nilai default dari notasi.
Lebih banyak contoh
Anda juga dapat menggunakan notasi yang sedikit berbeda di mana saja
VARX=${VARX-<def. value>}
.Di atas
$VAR1
&$VAR2
sudah ditentukan dengan string "memiliki nilai lain" tetapi$VAR3
tidak terdefinisi, jadi nilai default yang digunakan sebagai gantinya0
,.Contoh lain
Memeriksa dan menetapkan menggunakan
:=
notasiTerakhir saya akan menyebutkan operator yang praktis
:=
,. Ini akan melakukan pemeriksaan dan menetapkan nilai jika variabel yang diuji kosong atau tidak terdefinisi.Contoh
Perhatikan bahwa
$VAR1
sekarang sudah diatur. Operator:=
melakukan tes dan penugasan dalam satu operasi.Namun jika nilainya diatur sebelumnya, maka dibiarkan saja.
Tabel Referensi Handy Dandy
Referensi
sumber
bash
. Yang${var:-word}
ada di Q adalah, tetapi tidak di${var-word}
atas. Dokumentasi POSIX memiliki tabel yang bagus, mungkin layak untuk menyalinnya ke jawaban ini - pubs.opengroup.org/onlinepubs/9699919799/utilities/…echo "${FOO:=default}"
itu bagus jika Anda benar-benar menginginkannyaecho
. Tetapi jika Anda tidak melakukannya, maka coba:
built-in ...: ${FOO:=default}
Anda$FOO
diatur kedefault
atas (yaitu, jika belum ditetapkan). Tapi tidak ada gaung$FOO
dalam proses.${4:-$VAR}
wasiat akan berhasil.@slm telah menyertakan dokumen POSIX - yang sangat membantu - tetapi mereka tidak benar-benar memperluas bagaimana parameter ini dapat digabungkan untuk mempengaruhi satu sama lain. Belum ada sebutan di sini tentang formulir ini:
Ini adalah kutipan dari jawaban saya yang lain, dan saya pikir itu menunjukkan dengan sangat baik bagaimana ini bekerja:
Contoh lain dari yang sama :
Contoh di atas mengambil keuntungan dari semua 4 bentuk substitusi parameter POSIX dan berbagai
:colon null
ataunot null
pengujian. Ada informasi lebih lanjut di tautan di atas, dan ini dia lagi .Hal lain yang sering tidak dipertimbangkan orang
${parameter:+expansion}
adalah betapa bermanfaatnya dokumen ini. Berikut kutipan lain dari jawaban yang berbeda :TERATAS
Di sini Anda akan menetapkan beberapa default dan bersiap untuk mencetaknya saat dipanggil ...
TENGAH
Di sinilah Anda mendefinisikan fungsi lain untuk memanggil fungsi cetak Anda berdasarkan hasil mereka ...
BAWAH
Anda telah menyiapkan semuanya sekarang, jadi di sinilah Anda akan menjalankan dan menarik hasil Anda.
HASIL
Saya akan membahas mengapa suatu saat, tetapi menjalankan di atas menghasilkan hasil sebagai berikut:
BAGAIMANA ITU BEKERJA:
Fitur utama di sini adalah konsep
conditional ${parameter} expansion.
Anda dapat mengatur variabel ke nilai hanya jika tidak disetel atau null menggunakan formulir:Jika Anda hanya ingin menetapkan variabel yang tidak disetel, Anda akan menghilangkan
:colon
dan nilai-nilai nol akan tetap apa adanya.TENTANG RUANG LINGKUP:
Anda mungkin memperhatikan bahwa dalam contoh di atas
$PLACE
dan$RESULT
diubah ketika diatur melaluiparameter expansion
meskipun_top_of_script_pr()
telah dipanggil, mungkin pengaturan mereka ketika dijalankan. Alasan ini bekerja adalah bahwa_top_of_script_pr()
adalah( subshelled )
fungsi - Saya sertakan dalamparens
daripada{ curly braces }
yang digunakan untuk orang lain. Karena itu disebut dalam subkulit, setiap variabel yang disetel adalahlocally scoped
dan saat ia kembali ke shell induknya, nilai-nilai itu menghilang.Tetapi ketika
_more_important_function()
set$ACTION
ituglobally scoped
begitu mempengaruhi_less_important_function()'s
evaluasi kedua$ACTION
karena_less_important_function()
set$ACTION
hanya melalui${parameter:=expansion}.
sumber
Pengalaman pribadi.
Saya menggunakan format ini kadang-kadang dalam skrip saya untuk melakukan ad-hoc nilai yang berlebihan, misalnya jika saya memiliki:
Saya bisa berlari:
tanpa harus mengubah nilai default asli dari
SOMETHING
.sumber