为什么“ eval”在While循环中不起作用

时间:2019-09-05 15:31:53

标签: bash while-loop eval

我在while循环中使用eval解析变量时遇到了挑战。使用getops脚本成功地在循环外对其进行了处理。

script.sh -l foo1 ($OPT_L)

(在我的脚本内)

foo1=`shuf 1-10 -n 1`
eval LOCATION=\$$OPT_L

如果我回显$ LOCATION,我将得到预期的1到10之间的随机值。

在循环中,我正在检查LOCATION的值是否存在,如果找到匹配项,请使用另一个随机数重新运行评估,直到USEDPORT为0

循环内的评估无效。

   USEDPORT=$(grep $LOCATION /home_vpn/*/lastport | wc -l)
    counter=1
    while [ $USEDPORT -ge 1 ] || [ $counter -lt 10 ] ; do
            echo "Port $LOCATION is being used $USEDPORT times"
            echo "Counter is $counter"
            echo "OPTL is $OPT_L"
            eval LOCATION=\$$OPT_L
            counter=$(( $counter + 1 ))
    done

脚本输出:

./ vpn-ip-update-add.sh.new -l foo1

端口10004被使用1次 计数器是1 端口10004被使用1次 计数器是2 端口10004被使用1次 计数器是3 端口10004被使用1次 计数器是4 端口10004被使用1次

1 个答案:

答案 0 :(得分:0)

不要使用eval:使用间接参数扩展。

LOCATION=${!OPT_L}

更好的是,不要将内部变量名称作为脚本外部接口的一部分。

这里是case语句的示例,该语句将外部参数映射到内部值。

case $OPT_L in
  value1) LOCATION=location1 ;;
  value2) LOCATION=location2 ;;
  *) printf 'Invalid location %s\n' "$OPT_L"; exit 1 ;;
esac