一.關於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}
結果圖:
總結:
如果
執行含有字符串的命令
例3.
首先創建一個名爲test 的小文件如下:
[corrinr@localhost myscript]$ //結果爲:vi text
[corrinr@localhost myscript]$ ls
//結果爲:text
[corrinr@localhost myscript]$ cat text
//結果爲:how are you?
//結果爲:I am fine,thanks
myfile="cat text"
echo $myfile
//結果爲:cat text
eval $myfile
-
#!/bin/bash
echo "Total of the arguments passed $#"
echo "The process Id is $$"
echo "Last argument is "$(eval echo \$$#)""
結果圖:
在上面的腳本中, eval命令首先把 $$#
解析爲當前shell的參數個數,然後在第二次掃描時得出最後一個參數。
如果使用命令:
echo ” \ $$#”
則得到的結果是 $4,而不是我們想要的44。這裏涉及到一個變量間接引用的問題,我們的本意是輸出 $4,默認情況下,命令後忽略變量間接引用的情況。
這時候,就可以使用eval命令.
eval echo “\$$#”
得到的結果爲44
三.shell 中的倒引號 “eval 和 $() 的區別
倒引號括起來的是一條命令,
以下情況倒引號和 $()可以互換
例6
寫如下代碼在test.sh中 :
!/bin/bash
echo `date`
echo "-----------------"
echo $(date)
- 反引號和$()的區別
!/bin/bash
echo `echo \\`
echo `echo \\\\`
echo $(echo \\)
echo $(echo \\\\)
通過上述的測試,我們可以發現:
1.反引號齊本身就對\進行了轉義,保留了其本身意思,如果我們想在反引號中起到\的特殊意義,我們必須使用2個\來進行表示。所以我們可以簡單的想象成反引號中 \ = \
2. $()中則不需要考慮\的問題,與我們平常使用的一樣 \ = \