bash 的 eval 用法 - Linux

Barb Cronin avatar
By Barb Cronin
at 2016-05-18T11:30

Table of Contents


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'

--
因為她不知道,唯一值得她流淚的人,絕不會讓她流淚。

--
Tags: Linux

All Comments

Olive avatar
By Olive
at 2016-05-18T22:34
不過用 eval 真的很累,程式碼可讀性降低很多
Tristan Cohan avatar
By Tristan Cohan
at 2016-05-22T15:30
之前用過幾次,後來發現過兩天連自己都不知道在寫啥,
果斷放棄@@

Ubuntu 16.04 Nvidia driver

Connor avatar
By Connor
at 2016-05-18T10:13
小弟筆電 Acer 4830Tg 顯卡 GT540M 剛裝完 Ubuntu Gnome 16.04 ,在裝完Nvidia dr iver V361.42,重開機之後就會黑畫面…不知版上有無人有相同問題… - ...

當機後fsck後沒聲音

Edith avatar
By Edith
at 2016-05-17T22:21
linux mint 17.3 mate benatben-All-Series ~ $ sudo apt-get install --reinstall pulseaudio [sudo] password for ben: 正在讀取套件清單... 完成 正在重建相依關係 正在讀取狀態資料... 完成 有 ...

/tmp權限跑掉造成samba異常

Franklin avatar
By Franklin
at 2016-05-17T21:31
兩天前有求救說samba異常,後來翻遍一堆log才在之前裝好的audit中看到大量 chdir|fail (拒絕不符權限的操作)|chdir|/tmp 我才注意到/tmp權限變成0700,改成1777就沒事了。 問題來了,我的系統只有root有shell,我看過history沒有chmod動過/tmp, 也 ...

請問有基於WEB的下載管理套件嗎?

Necoo avatar
By Necoo
at 2016-05-17T17:29
感謝各位先進的研究 小弟昨天在家裡意外翻出一台壹網樂 動一動就把它改成debian 目前自架了ftp很是方便 請問linux上有基於web的下載管理器嗎?(不是BT用,普通http連結就可) 這樣我可以用http://IP/進去然後新增下載連結 讓他慢慢跑,之後再ftp拉回電腦就好atat 有看到一個 ...

apache找不到網頁

Faithe avatar
By Faithe
at 2016-05-17T15:13
我的網站架好了以後 全部頁面都很正常 可是就是有一個頁面他無法被開啟 error_log也只淡淡的回應了 script and#39;/var/www/zzz/ooo/xxx_excel.phpand#39; not found or unable to stat 檔案確定有在伺服器上 在自己電腦上架的測試平 ...