看板 Linux 關於我們 聯絡資訊
bash 雖然沒有複雜的資料結構,但都可以透過 eval 來實現。 覺得這東西蠻好玩得,可以寫出一些有趣的 function 。 首先基本款。 但如果變數內容是命令,倒可以真接執行。 所以我一開始才誤會 eval 成 **執行** 變數內容的意思…… cmd="echo $QUERY_STRING" $cmd ## 這樣會 echo 出 QUERY_STRING 的內容。 QUREY_STRING="a=b c=d" $QUERY_STRING ## 這樣不行… … eval $QUERY_STRING ## 這樣可以! eval 的 *正式* 用法: for i in `seq $#` do eval echo \$$i done ## 列出所有參數 eval echo \$$# ## 列出最後一個參數 複雜的情況: 因為 eval 時會把雙引號中的變數展開,且拿掉雙引號。 雙引號內的單引號會被看成普通字元, 而真得執行時才會看到單引號和引號內已被展開的變數。 雙引號中也會執行命令代換。 for file in * do eval "'$file'"="'`cat $file`'" done 特殊的用法: 用來處理重導向需要的符號。 output=" >'$PWD/log' " eval ps aux $output 用在轉義字符: 我一直很好奇 bash 的 $'' 可以作什麼; 後來才想到可以用 eval 來讓 bash *翻譯* 內部的變數。 esc_str='\u0042\u0043' eval echo "\$'$esc_str'" 命令代換中也可以接收 pipe ,我還蠻意外的。 echo %42%43%44 | eval echo "\$'`sed -e s/%/\\x/g`'" 什麼鬼,這辦得到嗎? 我開始覺得單雙引號不夠用了;或者要多幾層 eval 。 regex='s/%/\\x/g' echo %42%43%44 | eval echo "\$'$(sed -e $regex)'" eval eval echo "\"\\$'\$(sed -e '$regex')'\"" eval echo "\$'$(sed -e 's/%/\\x/g')'" echo $'sed_output' -- 因為她不知道,唯一值得她流淚的人,絕不會讓她流淚。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.1.136 ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1463542266.A.CE1.html ※ 編輯: Gold740716 (140.116.1.136), 05/18/2016 11:33:23
kenduest: 不過用 eval 真的很累,程式碼可讀性降低很多 05/18 11:41
rickieyang: 之前用過幾次,後來發現過兩天連自己都不知道在寫啥, 05/18 21:17
rickieyang: 果斷放棄@@ 05/18 21:17