[心得] bash 的 eval 用法

楼主: Gold740716 (项为之强)   2016-05-18 11:30:58
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'
作者: kenduest (小州)   2016-05-18 11:41:00
不过用 eval 真的很累,程式码可读性降低很多
作者: rickieyang (Rickie Yang)   2016-05-18 21:17:00
之前用过几次,后来发现过两天连自己都不知道在写啥,果断放弃@@

Links booklink

Contact Us: admin [ a t ] ucptt.com