linux下的eval命令

1. eval command-line

其中commandline是在終端上鍵入的一條普通命令行。然而當在它前面放上eval時,其結果是shell在執行命令行之前掃描它兩次。eval命令將會首先掃描命令行進行所有的替換,然後再執行命令。該命令使用於那些一次掃描無法實現其功能的變量。該命令對變量進行兩次掃描。這些需要進行兩次掃描的變量有時候被稱爲複雜變量。如:

pipe="|"

eval ls $pipe wc -l

如圖:

shell1次掃描命令行時,它替換出pipe的值|,接着eval使它再次掃描命令行,這時shell把|作爲管道符號了。

如果變量中包含任何需要shell直接在命令行中看到的字符(不是替換的結果),就可以使用eval。命令行結束符(;| &),Io重定向符(< >)和引號就屬於對shell具有特殊意義的符號,必須直接出現在命令行中。

eval也可以用於回顯簡單變量,不一定是複雜變量。

如:

NAME=NO

eval echo $NAME等價於echo $NAME

2. eval echo \$$#取得最後一個參數

如:cat last

eval echo \$$#

./last one two three four

four

如圖:

第一遍掃描後,shell把反斜槓去掉了。當shell再次掃描該行時,它替換了$4的值,並執行echo命令

3.以下示意如何用eval命令創建指向變量的“指針”:

x=100

ptrx=x

eval echo \$$ptrx指向ptrx,用這裏的方法可以理解b中的例子

100 打印100

eval $ptrx=5050存到ptrx指向的變量中。

echo $x

50 打印50

如圖:


【與``和$()的區別】

在$(命令)中,命令部分的內容不會被父shell解析,而反引號的部分卻會被解析,例如`\`,`$`,```
舉個例子
> $(echo "first second"|awk "\$2==\"second\" {print $1}") 執行是成功的,執行結果爲first
> a=`echo "first second"|awk "\$2==\"second\" {print $1}"`執行失敗
> awk: line 1: syntax error at or near ==

原因是反引號內的內容會被父shell解釋,所以\$2被父shell解釋後變成了$2, 而$2在子shell裏面是會被解析的,而默認的
$2代表子shell的第二個參數,顯然爲空,然後繼續被awk解釋,然後就報了上述的錯誤

其實還有另外一個錯誤,print $1,這裏的$符號也是要被父shell解釋的,則是不對的

最後改爲
> `echo "first second"|awk "\\$2==\"second\" {print \\$2}`

    1.反引號其本身就對\進行了轉義,保留了其本身意思,如果我們想在反引號中起到\的特殊意義,我們必須使用2個\來進行表示。

    2.所以我們可以簡單的想象成反引號中: \\ = \

    3.$()中則不需要考慮\的問題,與我們平常使用的一樣:\ = \



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章