Ketika shell mem-parsing sebuah baris, itu akan mengubah tokenize menjadi kata-kata, melakukan berbagai ekspansi (dalam urutan) pada kata-kata, kemudian jalankan perintah.
Seharusnya test=1:2:3:4:5:6
Mari kita lihat perintah ini: IFS=":" read a b c d e f <<< "$test"
Setelah tokenizing, dan terjadi ekspansi parameter :IFS=":"
read
a
b
c
d
e
f
<<<
"1:2:3:4:5:6"
Shell akan mengatur variabel IFS untuk durasi perintah read, dan read
tahu bagaimana menerapkan $ IFS ke inputnya , dan memberikan nilai pada nama-nama variabel.
Perintah ini memiliki cerita yang serupa, tetapi hasilnya berbeda: HOME="hello" echo "$HOME"
Karena ekspansi parameter terjadi sebelum perintah dimulai, shell memiliki:
HOME="hello" echo "/home/username"
Dan kemudian, selama eksekusi dari perintah echo, nilai baru $ HOME tidak digunakan sama sekali.
Untuk mencapai apa yang Anda coba lakukan, pilih salah satunya
# Delay expansion of the variable until its new value is set
HOME="hello" eval 'echo "$HOME"'
atau
# Using a subshell, so the altered env variable does not affect the parent.
# The semicolon means that the variable assignment will occur before
# the variable expansion
(HOME="hello"; echo "$HOME")
tapi jangan memilih yang pertama.
local
.eval
solusinya harus dihindari?Ada dua cakupan: variabel lingkungan dan variabel lokal. Variabel lingkungan valid untuk setiap proses (lihat
setenv
,getenv
), sedangkan variabel lokal hanya aktif dalam sesi shell ini. (Ini bukan perbedaan yang jelas ...)Tersirat
env
(seperti dalam contoh Anda) memodifikasi lingkungan, sementaraecho ...
menggunakan yang lokal - jadienv
tidak berpengaruh.Untuk memodifikasi variabel lokal gunakan, katakan,
Di sini tanda kurung menentukan ruang lingkup penugasan ini.
sumber