今天寫腳本,遇到awk腳本向shell傳參的情況,上網谷歌一下,發現都有些麻煩,通過管道,通過eval,感覺都很復雜。於是想到用read來試一下。
首先構造一個測試文件test.txt,里面的內容是1 2 3。
一開始嘗試
awk '{print $1 $2 $3}' test.txt | read a b c
可是echo $a,發現為空,失敗了。
試了下
echo "1 2 3" | read a b c
也無法給a b c 賦值
看來read不是這樣用的,怒谷歌之,在stackoverflow找到一個類似的問題(stackoverflow真神器啊!)
鏈接:http://stackoverflow.com/questions/374687/why-is-echo-foo-read-a-echo-a-not-working-as-expected
里面有答主提到,
read a < <(echo foo)
可以對a賦值,試了一下,果然可以。
然后嘗試
read a b c< <(echo foo goo hoo)
也可以分別對a b c進行賦值!太激動了!
之后嘗試
read a b c< <(awk '{print $1 $2 $3}' test.txt)
失敗了,a的值變成了123,b,c為空。
這是為什么?因為awk沒有打印空格,只打印123,理所當然都賦給a了。
所以,加上分隔符
read a b c< <(awk '{print $1 " " $2 " " $3}' test.txt)
這下就成功了!
考慮到我的awk還要更復雜一些,再做些改造
read a b c< <(grep 1 test.txt | awk '{test=$1;test2=$2;test3=$3}END{print test,test2,test3}')
也成功了!
所以,awk可以通過這樣的方式向shell傳值。