linux腳本語言之shell 中的eval

.eval

eval
eval[]
eval

.

  • eval
    1.
[neau@mail ~]$ NAME=VALUEBANK
[neau@mail ~]$ eval echo $NAME
//結果爲:VALUEBANK
[neau@mail ~]$ echo $NAME
//結果爲:VALUEBANK

  • 2.
v1="francs"
v2="fpZhou"

c=1
echo ${c}

vname=v$c 
echo ${vname}

eval vvv="$"$vname 
echo ${vvv}

結果圖:
這裏寫圖片描述

總結:
evalcmdLine
eval 會對後面的 cmdLine 進行兩遍掃描,如果第一遍掃描後 cmdLine 是個普通命令,則執行此命令;
如果 cmdLine 中含有變量的間接引用,則保證間接引用的語義。


  • 3.
    首先創建一個名爲test 的小文件如下:
[corrinr@localhost myscript]$ //結果爲:vi text
[corrinr@localhost myscript]$ ls
//結果爲:text
[corrinr@localhost myscript]$ cat text
//結果爲:how are you?
//結果爲:I am fine,thanks

cattextmyfile

myfile="cat text"

echomyfile

echo $myfile
//結果爲:cat text

eval

eval $myfile

這裏寫圖片描述
-
4.

#!/bin/bash
echo "Total of the arguments passed $#"
echo "The process Id is $$"
echo "Last argument is "$(eval echo \$$#)""

結果圖:這裏寫圖片描述

在上面的腳本中, eval命令首先把 $$#解析爲當前shell的參數個數,然後在第二次掃描時得出最後一個參數。

5.
set11223344
44使
echo 4使 #來輸出最後一個參數,
如果使用命令:
echo ” \ $$#”
則得到的結果是 $4,而不是我們想要的44。這裏涉及到一個變量間接引用的問題,我們的本意是輸出 $4,默認情況下,命令後忽略變量間接引用的情況。
這時候,就可以使用eval命令.
eval echo “\$$#”
得到的結果爲44

.shell 中的倒引號 “eval 和 $() 的區別

倒引號括起來的是一條命令,shell 應該先執行該命令,然後將輸出結果立刻代換到當前命令行中,命令代換也可以用$()

  • 以下情況倒引號和 $()可以互換

    6
    test.sh

!/bin/bash
echo `date`
echo "-----------------"
echo $(date)


這裏寫圖片描述
- 反引號和$()的區別

7
test.sh

!/bin/bash
echo `echo \\`
echo `echo \\\\`
echo $(echo \\)
echo $(echo \\\\)


這裏寫圖片描述

通過上述的測試,我們可以發現:

1.反引號齊本身就對\進行了轉義,保留了其本身意思,如果我們想在反引號中起到\的特殊意義,我們必須使用2個\來進行表示。所以我們可以簡單的想象成反引號中 \ = \
2. $()中則不需要考慮\的問題,與我們平常使用的一樣 \ = \

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