wangbin
  • wangbin
  • 2019-06-30
  • IT

bash命令:eval

一. 简介

正常我们执行命令,会先对命令行进行一次扫描,替换变量,然后执行.

前面加上eval的话,会扫描两次命令行,替换变量,然后执行.

有些场景,eval命令用起来有奇效.

二.正常命令行执行

例如如下命令

TEST_STRING="tessssst"
TMP_TEST_STRING=TEST_STRING
echo ${TMP_TEST_STRING}

# 输出:
TEST_STRING

第三行,一次扫描的时候,把${TMP_TEST_STRING}变量替换成“TEST_STRING”,最终是执行

echo TEST_STRING

三.前面加上eval的命令行执行

前面加上eval的话,会扫描两次命令行,替换变量,然后执行.

例如如下命令

TEST_STRING="tessssst"
TMP_TEST_STRING=TEST_STRING
eval echo \${${TMP_TEST_STRING}}

# 输出:
tessssst

第三行包含eval命令,会对它进行两次扫描.

一次扫描,结果是: eval echo ${TEST_STRING}

二次扫描,结果是: echo "tessssst"

四. eval解决字典使用场景

bash本身是没有字典这个数据结构的.如果你要批量处理一些数据,就比较麻烦.

这时候,可以使用数组+eval来模拟字典来解决问题,示例如下

VALUE_A=(VALUE_A1 VALUE_A2 VALUE_A3)
echo "VALUE_A:${VALUE_A}"
echo ${VALUE_A[0]}
echo ${VALUE_A[1]}
echo ${VALUE_A[2]}

echo ""
VALUE_B=(VALUE_B1 VALUE_B2 VALUE_B3)
echo "VALUE_B:${VALUE_B}"
echo ${VALUE_B[0]}
echo ${VALUE_B[1]}
echo ${VALUE_B[2]}

VALUE_ARRAY=(VALUE_A VALUE_B)

for AVALUE in ${VALUE_ARRAY[@]}
do
    echo ""
    echo "AVALUE:${AVALUE}"
    eval echo \${${AVALUE}[0]}
    eval echo \${${AVALUE}[1]}
    eval echo \${${AVALUE}[2]}
done

五. 结尾

eval命令在某些场景下十分好使.

参考:

  1. https://www.cnblogs.com/chengjian-physique/p/8068332.html