eval 명령은 먼저 C 언어의 매크로 대체와 유사하게 명령줄에서 모든 대체를 검색한 다음 명령을 실행합니다. 이 명령은 한 번의 스캔으로 기능을 수행할 수 없는 변수에 사용됩니다. 이 명령은 변수를 두 번 스캔합니다. 두 번의 스캔이 필요한 이러한 변수를 복소 변수라고도 합니다.
새 파일 테스트를 만들고, 파일에 "HelloWorld!" 문자열을 쓰고, WORD 변수에 cat test를 할당하면 테스트에서 내용을 가져올 수 없습니다. eval 명령은 다음 명령을 두 번 스캔하기 때문에 처음에는 WORD를 cat test로 바꾸고 두 번째에는 cat test를 실행합니다.
2.eval은 복잡한 변수가 아닌 간단한 변수를 다시 작성하는 데에도 사용할 수 있습니다.
NAME=ZONE
eval echo $NAME은 echo $NAME
3과 동일합니다. eval 명령은 쉘에 전달된 마지막 매개변수를 가져올 수도 있습니다
매개변수, 마지막 매개변수의 내용을 보려면 echo를 사용하여 직접 표시할 수 있습니다. 첫 번째와 마지막 두 매개변수를 입력하면 echo $2를 사용하여 마지막 매개변수를 볼 수 있습니다.
但是,如果我们不知道参数个数还想查看最后一个参数内容该怎么办呢?这是我们就想到使用 $$#为传给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:一个典型错误的例子
명령줄이 복잡한 경우(파이프 또는 기타 문자 포함) $a 문자열의 내용을 직접 실행하면 오류가 발생합니다. 분석은 다음과 같습니다.
$a는 매개변수 확장에서 처리됩니다. 즉, 파이프라인 분석을 건너뛰므로 "|", "cut", "-f1", "-d"는 모두 id 명령의 매개변수가 됩니다 , 물론 문제가 발생했습니다.
하지만 첫 번째 명령줄 처리에서 얻은 "id", "|", "cut", "-f1", "-d" 문자열을 다시 처리하는 eval을 사용하면 이번에는 파이프라인을 올바르게 분석할 수 있습니다. .
요약: 명령줄을 통해 명령이나 스크립트 디자인이 올바르게 처리될 수 있는지 확인하세요. 단계를 건너뛰면 예기치 않은 오류가 발생할 수 있습니다.
관련 추천:
JavaScript에서 eval 사용에 대한 자세한 설명
JavaScript의 eval() 함수 반환 값에 대한 자세한 설명 및 가변 환경 사용 예
JavaScript가 eval() 함수를 사용하여 JavaScript 문자열 인스턴스를 계산하는 방법에 대한 자세한 설명
위 내용은 Linux에서 eval 명령을 사용하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!