我对for循环中的范围变量有疑问。在for循环中,我知道您可以使用{..}来定义范围。但我希望它可以由客户定义。所以脚本要求一个范围值,我希望它是灵活的。像这样:
#!/bin/bash
while true;
do
echo "Some explenation..."
read -p "Possible values are: ALL or RANGE (to define a specific range):" answer
case $answer in
#ALL
[aA][lL][lL] )
echo "ALL is selected, 1 to 250"
RANGE="{1..250}"
break
;;
#RANGE
[rR][aA][nN][gG][eE] )
echo "Range is selected, please define a custom range. Notation should be like: <start>..<stop>"
echo "or: <single> <single>"
echo "or a combination of both. Like: 1..23 28 29 101..145 180 212"
read RANGE
break
;;
#OTHERS
* )
echo "Typo error!! Not correct, type again ALL, PRI, SEC or
RANGE"
;;
esac
done
echo ""
echo "Range for this execution is set to:"
echo "$RANGE"
for NEXI in $RANGE
do
sleep 0.2
echo "Nexus number: $NEXI"
done
echo ...
但是,当我输入{1..10} 52 54 {120..128}时,输出为:
Nexus number: {1..10}
Nexus number: 52
Nexus number: 54
Nexus number: {120..128}
虽然我希望它像:
Nexus number: 1
Nexus number: 2
Nexus number: 3
Nexus number: 4
Nexus number: 5
Nexus number: 6
Nexus number: 7
Nexus number: 8
Nexus number: 9
Nexus number: 10
Nexus number: 52
Nexus number: 54
Nexus number: 120
Nexus number: 121
... etc.
完全写出来。
我该如何改变才能做到这一点?
谢谢。
问题是大括号扩展发生在变量扩展之前。如中所述man bash
:
扩展的顺序是:大括号扩展;波浪线扩展,参数和变量扩展,算术扩展和命令替换(以从左到右的方式完成);分词 和路径名扩展。
这意味着当您具有诸如$var
contains{1..3}
和do之类的内容时echo "$var"
,外壳程序会在将变量扩展为其值之前查找可能的括号扩展。由于括号位于变量中,因此这意味着外壳上看不到括号,因此不执行括号扩展。
eval
如果该变量是一个范围,则一种变通方法是该变量。在for
循环之前添加以下行:
if [[ $RANGE =~ ^[0-9]+\.\.[0-9]+$ ]]; then
RANGE=$(eval echo {$RANGE})
fi
现在,更笼统地说,避免在shell脚本中使用CAPITAL变量名通常是一个好主意。环境变量通常大写,如果碰巧使用与定义的env变量相同的名称,则可能导致混淆。因此,为了安全起见,请使用小写的变量名。
而且,这是一个非常烦人的程序,需要调试并且同样烦人。不要在运行时提示用户输入信息!相反,请更改脚本并使其带有参数。键入值很困难,烦人,容易出错,并且不能自动执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句