>  기사  >  운영 및 유지보수  >  Linux에서 eval 명령을 사용하는 방법에 대한 자세한 설명

Linux에서 eval 명령을 사용하는 방법에 대한 자세한 설명

小云云
小云云원래의
2018-03-31 13:55:355176검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.