1. 程式人生 > >shell中的變量與eval(轉)

shell中的變量與eval(轉)

use web ech 讀取 eva bin 報錯 href 命令行

原文鏈接:http://www.361way.com/shell-eval-variable/4957.html

shell 中經常會用到變量的嵌套的情況。比如,單個或多個變量的值作為變量名,再對該變量名取$獲取其內部的變量的情況,這種腳本寫起來很難搞,還好有eval 命令方便我們處理這種情況。便於理解,先來一個示例:

  1. #!/bin/bash
  2. a=‘my‘
  3. b=‘site‘
  4. my_site=‘my site www.361way.com‘
  5. echo a_b is "$a"_"$b"
  6. echo $("$a"_"$b")
  7. web="$a"_"$b"
  8. echo web is $web
  9. eval echo ‘$‘"$a"_"$b"
  10. eval echo ‘$‘{"$a"_"$b"}

比如上面這個示例,猜猜看它的運行結果是什麽?執行結果如下:

  1. # sh a.sh
  2. a_b is my_site
  3. a.sh: line 6: my_site: command not found
  4. web is my_site
  5. my site www.361way.com
  6. my site www.361way.com

從上面可以看出$("$a"_"$b")這種寫法會報錯,可以正確取到我們想要的結果可以有兩種寫法:eval echo ‘$‘"$a"_"$b" 或 eval echo ‘$‘{"$a"_"$b"} 。

eval 這麽神奇,到底是個什麽東東?

eval 命令將會首先掃描命令行進行所有的置換,然後再執行該命令。該命令適用於那些一次掃描無法實現其功能的變量,該命令對變量進行兩次掃描。這些需要進行兩次掃描的變量有時被稱為復雜變量。eval命令即可以用於回顯簡單變量,也可以用於回顯復雜變量。

再來個示例,該例中文件有兩列,第一列為變量名,第二列為變量值,讀取該文件後將第二列的值賦值給第一列,通過echo ${第一列列名} 就可以獲取後面的value值。如下:

  1. 變量名與變量值映射表:
  2. # more name_value.txt
  3. site www.361way.com
  4. mail [email protected].com
  5. user admin
  6. 腳本內容:
  7. # cat b.sh
  8. #!/bin/bash
  9. while read NAME VALUE
  10. do
  11. eval "${NAME}=${VALUE}"
  12. done < name_value.txt
  13. echo "$site $mail $user"

執行該腳本,結果如下:

  1. # sh b.sh
  2. www.361way.com [email protected].com admin

shell中的變量與eval(轉)