對 eval 命令的理解

eval

格式:eval [argument...]

可以二次迭代參數中的引用變量,然後將參數作爲命令,在shell中執行

如果是多個參數,那麼變量替換之後必須符合某個命令的格式,否則eval會報錯“**未找到命令”

與echo的區別:

  1. echo 對後面參數中的引用變量只能進行一次迭代
  2. echo 後面的參數是作爲字符串輸出到命令行,而不是作爲命令在shell中執行

示例:

  • 一次迭代可以解析引用變量的嵌套

    # 引用變量的嵌套
    file="txt.txt"
    dir="~/testcase/$file"
    t="cat $dir"
    echo $t
    eval echo $t
    eval $t
    
    # 輸出結果
    # $t 解析爲 cat ~/testcase/txt.txt,然後作爲 echo 命令的參數,輸出到終端
    cat ~/testcase/txt.txt
    # 先將 $t 解析爲 cat /home/lfp/testcase/txt.txt,再將 echo  cat /home/lfp/testcase/txt.txt 作爲命令,
    # 在shell中執行,echo 命令的作用便是將後面的參數作爲字符串輸出到終端
    cat /home/lfp/testcase/txt.txt
    # 先將 $t 解析爲 cat /home/lfp/testcase/txt.txt,再將 cat /home/lfp/testcase/txt.txt 作爲命令,在shell中執行
    test case txt file # 此爲 txt.txt 文件中的內容,作爲cat 命令的執行結果輸出到終端
    
  • 二次迭代可以解析,一次迭代後,和參數中的'$',組成的,新的引用變量

    lfp@legion:~$ days=365
    lfp@legion:~$ year=days
    lfp@legion:~$ echo $year
    days
    lfp@legion:~$ echo \$$year
    $days
    # 第一次 $year 解析爲 days,跟參數中的 $,組合成新的引用變量 $days,變爲 eval echo $days
    # 第二次 $days 解析爲365,變爲 eval echo 365,消除了引用變量,於是將 echo 365 作爲命令,在shell中執行
    # 替換之後的參數爲 echo 365 符合echo命令格式,於是在shell中執行 echo 365 這個命令,輸出 365
    lfp@legion:~$ eval echo \$$year
    365
    
    # 參數 \$$year 被兩次解析爲365,eval 便將 365 作爲命令,在shell中執行,但是365 不是一個命令,所以報錯
    lfp@legion:~$ eval \$$year
    365:未找到命令
    
  • 官方例子改編

    # 定義兩個變量
    lfp@legion:~$ foo=10 x=foo 
    
    # 一般命令的執行,對於引用變量只解析一次
    # 下面命令的執行結果是 y=$foo
    lfp@legion:~$ y='$'$x	# 先解析爲 '$'foo,再賦值給變量 y
    lfp@legion:~$ echo $y
    $foo
    lfp@legion:~$ echo y='$'$x # 先解析爲 y='$'foo,再作爲echo命令的參數,輸出到終端
    y=$foo
    lfp@legion:~$ echo $y
    $foo
    
    # eval 可以兩次迭代引用變量
    lfp@legion:~$ eval echo y='$'$x	
    y=10
    lfp@legion:~$ echo $y # y=10 未作爲命令在shell中執行,變量 y 的值未改變
    $foo
    lfp@legion:~$ eval y='$'$x            
    lfp@legion:~$ echo $y  # y=10 作爲命令在shell中執行,變量 y 的值被改變
    10
    
  • 測試3次迭代

    lfp@legion:~$ a=b
    lfp@legion:~$ b=c
    lfp@legion:~$ c=d
    lfp@legion:~$ eval echo $a
    b
    lfp@legion:~$ eval echo '$'$a
    c
     # 自己測試沒有3次迭代
    lfp@legion:~$ eval echo '$''$'$a
    21947b
    

參考

https://unix.stackexchange.com/a/23115

http://cn.linux.vbird.org/linux_basic/Mandrake9.0/0320bash.php#eval

http://www.361way.com/shell-eval-variable/4957.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章