La commande
eval analysera d'abord la ligne de commande pour toutes les substitutions, similaire à la substitution de macro en langage C, puis exécutera la commande. Cette commande est utilisée pour les variables dont les fonctions ne peuvent pas être réalisées par une seule scrutation. Cette commande analyse les variables deux fois. Ces variables qui nécessitent deux analyses sont parfois appelées variables complexes.
Créez un nouveau fichier test, écrivez la chaîne "HelloWorld!" et attribuez cat test à la variable WORD. ne peut pas être atteint. Le contenu du test ; cependant, eval WORD peut afficher le contenu du fichier car la commande eval analyse les commandes suivantes deux fois la première fois qu'elle remplace WORD par cat test, et la deuxième fois, elle exécute cat test.
2.eval peut également être utilisé pour réécrire de simples variables , pas nécessairement une variable complexe.
NAME=ZONE
eval echo $NAME est équivalent à echo $NAME
3. commande eval Vous pouvez également obtenir le dernier paramètre passé au shell
Si nous connaissons le nombre de paramètres et que nous voulons voir le contenu du dernier paramètre, nous pouvons utiliser echo pour l'afficher directement, comme saisir en premier Pour les deux derniers paramètres, on peut utiliser echo $2 pour afficher le dernier paramètre
但是,如果我们不知道参数个数还想查看最后一个参数内容该怎么办呢?这是我们就想到使用 $$#为传给shell脚本的参数个数,但是上例中 echo “$$#”后显示的其实是参数个数,而使用eval echo “$$#”才显示最后一个参数的内容。
对上述第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
4、条件筛选
在file文件中写入两列数据,第一列对应KEY 、第二列为VALUE,使用eval命令将KEY与VALUE的值对应起来,从文件中读取
eval进阶:
1.shell 也提供了 eval 命令,如同熟悉的其他脚本语言,会将它的参数做为命令执行,初看会疑惑为什么shell要提供两种动态执行命令字串的机制,但是经过仔细分析,才发现shell的eval同其他语言有很大区别。
2.shell 中的 eval
2.1 不能获得函数处理结果 ,如1所说,所有命令,函数的处理结果只能通过 ``来获得,那么其它语言中利用eval来获得动态生成代码执行后的输出变得不可能。
2.2 eval 嵌套无意义 ,在其他语言中可以通过 eval(eval("code")),来执行(执行动态生成的code的返回),而由于shell 中 eval 将后面的eval命令简单当作命令字符串执行,失去了嵌套作用,嵌套被命令替换取代。
eval的作用是再次执行命令行处理,也就是说,对一个命令行,执行两次命令行处理。这个命令要用好,就要费一定的功夫。我举两个例子,抛砖引玉.
例子1:用eval技巧实现shell的控制结构for
[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实现了for结构。
当执行eval $@时,它经历了步骤如下:
第1步,分割成eval $@
第6步,扩展$@为hostname
第11步,找到内置命令eval
重复一次命令行处理,第11步,找到hostname命令,执行。
注意:也许有人想当然地认为,何必用eval呢?直接$@来执行命令就可以了嘛。
例子2:一个典型错误的例子
Si la ligne de commande est complexe (incluant des tubes ou d'autres caractères), exécuter directement le contenu de la chaîne $a Quelque chose s'est mal passé. L'analyse est la suivante.
$a est traité dans l'expansion des paramètres, c'est-à-dire que l'analyse du pipeline est ignorée, donc "|", "cut", "-f1", "-d" deviennent tous C'est devenu le paramètre de la commande id , et bien sûr, quelque chose s'est mal passé.
Mais eval est utilisé, qui traite à nouveau les chaînes "id", "|", "cut", "-f1", "-d" obtenues lors du premier traitement de la ligne de commande. traitement, cette fois le pipeline peut être analysé correctement.
En bref : assurez-vous que la conception de votre commande ou de votre script peut être traitée correctement via la ligne de commande. Sauter une étape peut provoquer des erreurs inattendues !
Recommandations associées :
L'utilisation d'eval dans JavaScript Explication détaillée
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!