0?前言
在JavaScript語言中,有一個很特別的函數eval,eval函數可以將字符串當做 JavaScript 代碼執行,返回表達式或值。
在Linux Shell 中也提供了內建命令eval,它是否具有JavaScript語言中eval函數的功能呢?
1 eval命令的格式、功能和返回值
我們可以使用 help eval命令來查看eval命令的幫助信息。
purpleEndurer @ bash ~ $ help eval
eval: eval [arg ...]
? ? Execute arguments as a shell command.
? ??
? ? Combine ARGs into a single string, use the result as input to the shell,
? ? and execute the resulting commands.
? ??
? ? Exit Status:
? ? Returns exit status of command or success if command is null.
1.1?eval命令的格式
eval [參數...]
參數說明:參數不限數目,彼此之間用分號分開。
1.2 eval?命令的功能
將參數作為 shell 命令執行。
確切來說,是將參數組合成一個字符串,將結果用作 shell 的輸入,并執行生成的命令。
1.3 eval命令的返回值
- 如果沒有參數,eval返回成功(0)。
- 如果有參數,eval返回參數作為命令執行后的退出狀態。
2 eval 命令用法實例
2.1 eval不帶參數
purpleEndurer @ bash ~ $ eval
purpleEndurer @ bash ~ $ echo $?
0
?
?
2.2??eval簡單回顯
purpleEndurer @ bash ~ $ echo $0
bash
purpleEndurer @ bash ~ $ eval echo $0
bash
可見?命令?eval echo $0 和? echo $0?的功能是一樣的。
2.3?利用eval命令執行其它命令
我們把命令 echo hello?賦值給變量c,再用eval命令來這個命令:
purpleEndurer @ bash ~ $ c="echo hello"
purpleEndurer @ bash ~ $ eval $c
hello
2.4?利用eval命令執行函數
我們先定義3個函數a1、a2、a3
function a1()
{echo a1; #顯示 a1
}function a2()
{echo a2; #顯示 a2
}function a3()
{echo a3; #顯示 a3
}
2.4.1 用for循環調用eval命令來執行它們
purpleEndurer @ bash ~ $ function a1(){ echo a1; }; function a2(){ echo a2; }; function a3(){ echo a3; }
purpleEndurer @ bash ~ $ for i in {1..3}; do eval a${i}; done
a1
a2
a3
purpleEndurer @ bash ~ $?
?
2.4.2?根據用戶輸入的數字執行相應的函數
purpleEndurer @ bash ~ $ ?function a1(){ echo a1; }; function a2(){ echo a2; }; function a3(){ echo a3; }
purpleEndurer @ bash ~ $ echo -n enter 1 or 2 or 3:; read i; eval a${i}
enter 1 or 2 or 3:1
a1
purpleEndurer @ bash ~ $ echo -n enter 1 or 2 or 3:; read i; eval a${i}
enter 1 or 2 or 3:3
a3
purpleEndurer @ bash ~ $ echo -n enter 1 or 2 or 3:; read i; eval a${i}
enter 1 or 2 or 3:4
bash: a4: command not found
purpleEndurer @ bash ~ $?
?只要我們輸入1或2或3,就可以相應地執行a1、a2或a3,輸入其它數字則出錯。
2.5?在腳本中獲取最后一個命令行參數
我們先用cp /dev/stdin a.sh命令創建腳本a.sh,內容如下:
echo "\$$#" ? ? ? ??
eval echo "\$$#"
purpleEndurer @ bash ~ $ cp /dev/stdin a.sh
echo "\$$#" ? ? ? ??
eval echo "\$$#"
purpleEndurer @ bash ~ $ . a.sh 1 2 3
$3
3
purpleEndurer @ bash ~ $?
我們直接使用命令echo "\$$#",顯示出來的是?$3
我們使用eval echo "\$$#",將最后一個參數3正確顯示出來了。