2017-05-03 126 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