Cara menetapkan nilai ke beberapa variabel dalam baris perintah dengan bilah

10

Saya pada dasarnya mencoba untuk mengasumsikan bagian-bagian tertentu dari output dari perintah shell ke variabel mulitple, tapi saya tidak tahu bagaimana melakukannya.

Demi kesederhanaan, asumsikan bahwa perintah pada shell, ketika dijalankan, dicetak

one two three four

yang dapat disimulasikan dengan a

echo "one two three four"

(walaupun comannd yang sebenarnya berbeda)

Sekarang, saya ingin menetapkan kata kedua dan keempat dari keluaran (dalam hal ini dua dan empat ) ke variabel w1 dan w2 .

Saya pikir saya bisa menggunakan perintah baca seperti ini:

echo "one two three four" | awk '{print $2 " " $4}' | read w1 w2

tetapi ini tidak berhasil, mungkin karena perintah baca dijalankan dalam sub-proses.

Jadi, bagaimana saya akan mencapai apa yang saya inginkan?

René Nyffenegger
sumber

Jawaban:

17

Ini tidak berhasil karena readberjalan dalam proses anak yang tidak dapat mempengaruhi lingkungan orang tua.

Anda punya beberapa pilihan:

Anda dapat mengonversi perintah Anda ke:

w1=$(echo "one two three four" | awk '{print $2}')
w2=$(echo "one two three four" | awk '{print $4}')

Atau, ubah IFS dan gunakan set:

OIFS="$IFS"
IFS=' '
set -- $(echo "one two three four" | awk '{print $2" "$4}')
IFS="$OIFS"
w1=$1 w2=$2

atau String Di Sini:

read w1 w2 w3 w4 <<< "one two three four"
dogbane
sumber
4
Berdasarkan the Here String: baca a1 a2 a3 <<< $ (echo one two three)
Petr Uzel
Terima kasih banyak. Saya tidak tahu tentang<<< Here String
René Nyffenegger
1
Untuk keamanan Anda harus menggunakan read -r::do not allow backslashes to escape any characters
Tom Hale