shell中的變量與eval(轉)
阿新 • • 發佈:2017-08-30
use web ech 讀取 eva bin 報錯 href 命令行
原文鏈接:http://www.361way.com/shell-eval-variable/4957.html
shell 中經常會用到變量的嵌套的情況。比如,單個或多個變量的值作為變量名,再對該變量名取$獲取其內部的變量的情況,這種腳本寫起來很難搞,還好有eval 命令方便我們處理這種情況。便於理解,先來一個示例:
- #!/bin/bash
- a=‘my‘
- b=‘site‘
- my_site=‘my site www.361way.com‘
- echo a_b is "$a"_"$b"
- echo $("$a"_"$b")
- web="$a"_"$b"
- echo web is $web
- eval echo ‘$‘"$a"_"$b"
- eval echo ‘$‘{"$a"_"$b"}
比如上面這個示例,猜猜看它的運行結果是什麽?執行結果如下:
- # sh a.sh
- a_b is my_site
- a.sh: line 6: my_site: command not found
- web is my_site
- my site www.361way.com
- my site www.361way.com
從上面可以看出$("$a"_"$b")這種寫法會報錯,可以正確取到我們想要的結果可以有兩種寫法:eval echo ‘$‘"$a"_"$b" 或 eval echo ‘$‘{"$a"_"$b"} 。
eval 這麽神奇,到底是個什麽東東?
eval 命令將會首先掃描命令行進行所有的置換,然後再執行該命令。該命令適用於那些一次掃描無法實現其功能的變量,該命令對變量進行兩次掃描。這些需要進行兩次掃描的變量有時被稱為復雜變量。eval命令即可以用於回顯簡單變量,也可以用於回顯復雜變量。
再來個示例,該例中文件有兩列,第一列為變量名,第二列為變量值,讀取該文件後將第二列的值賦值給第一列,通過echo ${第一列列名} 就可以獲取後面的value值。如下:
- 變量名與變量值映射表:
- # more name_value.txt
- site www.361way.com
- mail [email protected].com
- user admin
- 腳本內容:
- # cat b.sh
- #!/bin/bash
- while read NAME VALUE
- do
- eval "${NAME}=${VALUE}"
- done < name_value.txt
- echo "$site $mail $user"
執行該腳本,結果如下:
- # sh b.sh
- www.361way.com [email protected].com admin
shell中的變量與eval(轉)