【问题标题】:Why does "eval" not work inside While loop为什么“eval”在 While 循环中不起作用
【发布时间】:2020-01-08 13:09:52
【问题描述】:

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

script.sh -l foo1 ($OPT_L)

(在我的脚本中)

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

如果我回显 $LOCATION,我将按预期得到一个从 1 到 10 的随机值。

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

循环内的 eval 不起作用。

   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次

【问题讨论】:

  • ...请注意,声称 eval 在 while 循环中不起作用肯定是错误的。如果问题中的代码清楚地表明了这一点,那就太好了,但它需要其他人不会拥有的日志文件,因此它不能真正在 OP 的本地环境之外运行。 (此外,它实际上不包括设置OPT_L 所需的getopts 代码,或任何手动设置/模拟getopts 正在执行的存根代码)。

标签: bash while-loop eval


【解决方案1】:

不要使用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

【讨论】:

  • 感谢您的回复,请参阅上面的回复(由于回复字符限制,计数不适合)
猜你喜欢
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多