我在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次
答案 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