Apakah ada keuntungan / kerugian dari menginisialisasi nilai variabel bash dalam skrip, baik sebelum kode utama, atau variabel lokal dalam suatu fungsi sebelum menetapkan nilai aktual ke dalamnya?
Apakah saya perlu melakukan sesuatu seperti ini:
init()
{
name=""
name=$1
}
init "Mark"
Apakah ada risiko variabel diinisialisasi dengan nilai-nilai sampah (jika tidak diinisialisasi) dan yang memiliki efek negatif dari nilai-nilai variabel?
name = ""; name = argv[1];
? Dan bukankah itu tidak ada gunanya?Jawaban:
Tidak ada manfaatnya untuk menetapkan string kosong ke variabel dan kemudian segera menetapkan string variabel lain untuk itu. Penugasan nilai ke variabel shell akan sepenuhnya menimpa nilai sebelumnya.
Setahu saya tidak ada rekomendasi yang mengatakan bahwa Anda harus secara eksplisit menginisialisasi variabel ke string kosong. Bahkan, melakukan hal itu dapat menutupi kesalahan dalam beberapa keadaan (kesalahan yang akan terlihat jika berjalan di bawah
set -u
, lihat di bawah).Variabel yang tidak disetel, tidak digunakan sejak awal skrip atau secara eksplisit tidak disetel dengan menjalankan
unset
perintah di atasnya, tidak akan memiliki nilai. Nilai variabel semacam itu tidak akan berarti apa-apa. Jika digunakan sebagai"$myvariable"
, Anda akan mendapatkan yang setara dengan""
, dan Anda tidak akan pernah mendapatkan "data sampah".Jika opsi shell
nounset
diatur dengan salah satuset -o nounset
atauset -u
, maka referensi variabel yang tidak disetel akan menyebabkan shell menghasilkan kesalahan (dan shell non-interaktif akan berakhir):atau, di
bash
:Variabel Shell akan diinisialisasi oleh lingkungan jika nama variabel sesuai dengan variabel lingkungan yang ada.
Jika Anda berharap bahwa Anda menggunakan variabel yang dapat diinisialisasi oleh lingkungan dengan cara ini (dan jika tidak diinginkan), maka Anda dapat menghapusnya secara eksplisit di depan bagian utama skrip Anda:
yang juga akan menghapusnya sebagai variabel lingkungan, atau, Anda dapat mengabaikan nilai awal dan hanya menimpanya dengan tugas (yang akan membuat nilai perubahan variabel lingkungan juga).
Anda tidak akan pernah menemukan sampah yang tidak diinisialisasi dalam variabel shell (kecuali, seperti yang disebutkan, bahwa sampah sudah ada di variabel lingkungan dengan nama yang sama).
sumber
unset
ting) sebelum menjalankan beberapa jenisfor
atauwhile
loop untuk mengaturnya ke perhitungan nilai jika ada kemungkinan loop tidak akan benar-benar berjalan karena kondisi tidak terpenuhi; dan variabel mungkin telah diatur ke beberapa nilai lain di lingkungan skrip yang diwarisi. Tapi ini bisa dibilang lebih baik untuk meletakkan segala sesuatu di dalammain()
dan mendefinisikan variabel sebagailocal
.:
, misalnya${myvariable-defaultvalue}
Sunting : Whoops, ternyata deklarasi berbeda dari inisialisasi. Saya akan meninggalkan ini di sini sehingga coders pemula seperti saya dapat belajar dari kesalahan saya.
Keuntungan dari mendeklarasikan variabel lokal dalam suatu fungsi adalah Anda dapat dengan mudah menyalin kode.
Misalnya, katakan saya memiliki fungsi:
Jika saya ingin membuatnya menjadi skrip, saya mengabaikan saja
local
pernyataan itu dan menyalin yang lainnya:Jika deklarasi dan penugasan berada di baris yang sama, saya harus mengedit
local
bagian secara manual sebelum saya bisa mengubahnya menjadi skrip:Dalam contoh ini ini bukan masalah besar, tetapi jika Anda berurusan dengan fungsi yang lebih besar, lebih kompleks, itu bisa menjadi lebih menyakitkan.
sumber