Der Befehl
eval durchsucht zunächst die Befehlszeile nach allen Ersetzungen, ähnlich der Makroersetzung in der Sprache C, und führt dann den Befehl aus. Dieser Befehl wird für Variablen verwendet, deren Funktionen nicht durch einen Scan erreicht werden können. Dieser Befehl scannt die Variablen zweimal. Diese Variablen, die zwei Scans erfordern, werden manchmal als komplexe Variablen bezeichnet.
Erstellen Sie eine neue Datei test, schreiben Sie die Zeichenfolge „HelloWorld!“ in die Datei und weisen Sie cat test der Variablen WORD zu Der Inhalt in test kann nicht erreicht werden; eval WORD kann jedoch den Inhalt in der Datei anzeigen, da der Befehl eval die folgenden Befehle zweimal durchsucht. Beim ersten Mal wird WORD durch cat test ersetzt und beim zweiten Mal wird cat test ausgeführt.
但是,如果我们不知道参数个数还想查看最后一个参数内容该怎么办呢?这是我们就想到使用 $$#为传给shell脚本的参数个数,但是上例中 echo “$$#”后显示的其实是参数个数,而使用eval echo “$$#”才显示最后一个参数的内容。 4、条件筛选 在file文件中写入两列数据,第一列对应KEY 、第二列为VALUE,使用eval命令将KEY与VALUE的值对应起来,从文件中读取 eval进阶: eval的作用是再次执行命令行处理,也就是说,对一个命令行,执行两次命令行处理。这个命令要用好,就要费一定的功夫。我举两个例子,抛砖引玉. 例子1:用eval技巧实现shell的控制结构for 这里我使用了函数递归以及eval实现了for结构。 注意:也许有人想当然地认为,何必用eval呢?直接$@来执行命令就可以了嘛。 例子2:一个典型错误的例子 Wenn die Befehlszeile komplex ist (einschließlich Pipes oder anderer Zeichen), wird der Inhalt der $a-Zeichenfolge direkt ausgeführt Will Etwas ist schief gelaufen. Die Analyse ist wie folgt. Verwandte Empfehlungen:
2.eval kann auch zum einfachen Zurückschreiben verwendet werden Variablen, nicht unbedingt eine komplexe Variable.
NAME=ZONE
eval echo $NAME entspricht echo $NAME
3. eval-Befehl Sie können auch den letzten an die Shell übergebenen Parameter abrufen
Wenn wir die Anzahl der Parameter kennen und den Inhalt des letzten Parameters anzeigen möchten, können wir echo verwenden um es direkt anzuzeigen, z. B. zuerst eingeben Für die letzten beiden Parameter können wir echo $2 verwenden, um den letzten Parameter anzuzeigen;对上述第3点补充:
今天学习eval命令时,发现了这个问题:
echo "Last argument is $(eval echo \$$#)" a b c d e
这句话本意打印:Last argument is e
但实际打印的是:Last argument is -bash a b c d e
$#一般用在脚本中的,用在命令行的话就要先使用set设置位置参数,因此修改为如下:
set - a b c d e
echo "Last argument is $(eval echo \$$#)"
Last argument is e
set - a b c d e f
echo "Last argument is $(eval echo $#)"
Last argument is 6
1.shell 也提供了 eval 命令,如同熟悉的其他脚本语言,会将它的参数做为命令执行,初看会疑惑为什么shell要提供两种动态执行命令字串的机制,但是经过仔细分析,才发现shell的eval同其他语言有很大区别。
2.shell 中的 eval
2.1 不能获得函数处理结果 ,如1所说,所有命令,函数的处理结果只能通过 ``来获得,那么其它语言中利用eval来获得动态生成代码执行后的输出变得不可能。
2.2 eval 嵌套无意义 ,在其他语言中可以通过 eval(eval("code")),来执行(执行动态生成的code的返回),而由于shell 中 eval 将后面的eval命令简单当作命令字符串执行,失去了嵌套作用,嵌套被命令替换取代。[root@home root]# cat myscript1
QUOTE:
#!/bin/sh
evalit(){
if [ $cnt = 1 ];then
eval $@
return
else
let cnt="cnt-1"
evalit $@
fi
eval $@
}
cnt=$1
echo $cnt | egrep "^[1-9][0-9]*$" >/dev/null
if [ $? -eq 0 ]; then
shift
evalit $@
else
echo 'ERROR!!! Check your input!'
fi
[root@home root]# ./myscript1 3 hostname
home
home
home
[root@home root]# ./myscript1 5 id |cut -f1 -d' '
uid=0(root)
uid=0(root)
uid=0(root)
uid=0(root)
uid=0(root)
注意:bash里有两个很特殊的变量,它们保存了参数列表。
$*,保存了以$IFS指定的分割符所分割的字符串组。
$@,原样保存了参数列表,也就是"$1""$2"...
当执行eval $@时,它经历了步骤如下:
第1步,分割成eval $@
第6步,扩展$@为hostname
第11步,找到内置命令eval
重复一次命令行处理,第11步,找到hostname命令,执行。
$a wird in der Parametererweiterung verarbeitet, das heißt, die Pipeline-Analyse wird übersprungen, sodass „|“, „cut“, „-f1“ und „-d“ alle werden Es wurde zum Parameter des ID-Befehls , und natürlich ist etwas schief gelaufen.
Es wird jedoch eval verwendet, das die aus der ersten Befehlszeile erhaltenen Zeichenfolgen „id“, „|“, „cut“, „-f1“, „-d“ erneut verarbeitet Diesmal kann die Pipeline korrekt analysiert werden.
Kurz gesagt: Stellen Sie sicher, dass Ihr Befehls- oder Skriptentwurf korrekt über die Befehlszeile verarbeitet werden kann. Das Überspringen eines Schritts kann zu unerwarteten Fehlern führen!
Das obige ist der detaillierte Inhalt vonAusführliche Erklärung zur Verwendung des eval-Befehls unter Linux. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!