2017-05-03 45 views
2

我需要你在下面确定我的问题的帮助,Unix的循环变量

我的目的是循环值的输入,而在同一时间检查输入值,如果其[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 
+2

您无法像使用'num_ $ i'那样定义动态变量。可能最好使用数组 – fedorqui

+0

或者根本不使用动态变量。只需使用num作为变量。在这个例子中看不到动态变量的需要。 –

+0

更换动态变量的建议?我还没有尝试过数组,但我现在正在阅读有关它,尽管 –

回答

2

我想你只需要下面

validnum='[0-9]' 

read -p "Please enter number $i: " num 

if [[ $num =~ ^$validnum{1}$ ]]; then 
# rest of the code 

位来自0-9匹配。请记住,我已将变量validnum内的括号表达式移动到可读的以上。将此片段插入代码应该可以解决您的问题。

正如在评论中所讨论的那样,你不需要为你的这个需求使用动态变量。


OP曾要求正则表达式的解释,

RegEx demo

从上述正则表达式页面引用,说明正则表达式^[0-9]{1}$

^字符串的开始断言位置

匹配列表中存在的单个字符下面[0-9]{1}

{1}量词 - 恰好匹配一个时间(无意义量词)

0-90 (ASCII 48)9 (ASCII 57)(区分大小写)之间的范围中的单个字符

$在字符串的结束时声明位置,或在字符串末尾的行结束符之前

+0

感谢您的帮助,我遵循之前关于动态变量的评论,并获得了正确的值。我不明白的是1^$ validnum {1} $ ..它是做什么的?它是输入值的长度吗? –

+0

@ZaCkDelaCruz:查看我的更新,看看它对你有帮助 – Inian