【发布时间】:2017-05-03 11:45:02
【问题描述】:
我需要您的帮助来确定下面的问题,
我的意图是循环输入值,同时检查输入值是否为 [0-9],然后将其保存到文件中,然后对其输出进行排序。
我的问题是,每当我运行脚本时,保留为 1 2 3 4 5 的值不是我输入的值,你能帮我解决这个问题吗?我认为条件语句中的变量声明存在问题,但我不知道任何解决方法。
#!/bin/bash -x
echo > save.txt
validnum='0-9'
for ((i=1;i<=5;i++))
do
read -p "Please enter number $i: " num_$i
if [[ ! $num_$i =~ [^$validnum$] ]] && [[ $num_$i == "" ]]
then
echo "Input numbers have been validated.."
echo $num_$i >> save.txt
else
echo "INVALID CHARACTERS IDENTIFIED.."
echo "Please review your Input Values"
exit 0
fi
done
echo "Sorting values.."
echo "Below are the sorted values"
echo `cat save.txt | sort -n`
这是我运行脚本时的扩展版本。
+ echo
+ validnum=0-9
+ (( i=1 ))
+ (( i<=5 ))
+ read -p 'Please enter number 1: ' num_1
Please enter number 1:
+ [[ ! 1 =~ [^0-9$] ]]
+ [[ ! 1 == '' ]]
+ echo 'Input numbers have been validated..'
Input numbers have been validated..
+ echo 1
+ (( i++ ))
+ (( i<=5 ))
+ read -p 'Please enter number 2: ' num_2
Please enter number 2:
+ [[ ! 2 =~ [^0-9$] ]]
+ [[ ! 2 == '' ]]
+ echo 'Input numbers have been validated..'
Input numbers have been validated..
+ echo 2
+ (( i++ ))
+ (( i<=5 ))
+ read -p 'Please enter number 3: ' num_3
Please enter number 3:
+ [[ ! 3 =~ [^0-9$] ]]
+ [[ ! 3 == '' ]]
+ echo 'Input numbers have been validated..'
Input numbers have been validated..
+ echo 3
+ (( i++ ))
+ (( i<=5 ))
+ read -p 'Please enter number 4: ' num_4
Please enter number 4:
+ [[ ! 4 =~ [^0-9$] ]]
+ [[ ! 4 == '' ]]
+ echo 'Input numbers have been validated..'
Input numbers have been validated..
+ echo 4
+ (( i++ ))
+ (( i<=5 ))
+ read -p 'Please enter number 5: ' num_5
Please enter number 5:
+ [[ ! 5 =~ [^0-9$] ]]
+ [[ ! 5 == '' ]]
+ echo 'Input numbers have been validated..'
Input numbers have been validated..
+ echo 5
+ (( i++ ))
+ (( i<=5 ))
+ echo 'Sorting values..'
Sorting values..
+ echo 'Below are the sorted values'
Below are the sorted values
++ cat save.txt
++ sort -n
+ echo 1 2 3 4 5
1 2 3 4 5
【问题讨论】:
-
您不能像使用
num_$i那样定义动态变量。可能最好使用数组 -
或者根本不使用动态变量。只需将 num 单独用作变量即可。在这种情况下看不出需要动态变量。
-
对替换动态变量有什么建议吗?我还没有尝试过数组,不过我目前正在阅读它
-
从技术上讲,您可以使用间接参数扩展来访问变量,尽管它很笨拙。
tmp=num_$i; if [[ ! ${!tmp} =~ ^$validnum$ ]] && [[ ${!tmp} == "" ]]。最好认识到循环的每次迭代都不需要单独的变量。 -
@ZaCkDelaCruz,这里为什么声明
[[ ! $num_$i =~ [^$validnum$] ]]不起作用?因为$num_$i扩展了两个变量num_和i。因为名称num_在 Bash 中是一个有效的变量名称。所以它会解析它们是两个变量。但是如果你用括号括起来${num_$i}将不起作用。因为它会抱怨bad substitution错误。如果您希望它起作用,您可以使用间接引用。var="num_$i" ; echo ${!var}会起作用。请参考Bash dynamic variable names。