2017-05-03 7 views
2

私は以下の私の問題を特定する際にあなたの助けを必要とし、その[0-9]は、その後にそれを保存した場合、同時に入力値を確認しながらUnixのループ変数

私の意図は、ループへの値の入力でありますファイルはそのファイルの出力をソートします。

私の問題は、私がスクリプトを実行するたびに、値が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

私はあなただけ0-9から単一数字を一致させるために、

validnum='[0-9]' 

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

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

を以下のように必要だと思います。変数validnumの中にブラケット式を移動したことを思い出してください。これは、が可読性のあるよりも元のバージョンよりも多くなっています。このスニペットをコードに挿入すると、問題が解決されます。

コメントで説明したように、この要件に動的変数を使用する必要はありません。


OPは

RegEx demo

^[0-9]{1}$

^は、文字列の先頭位置を主張する正規表現を説明する、上記の正規表現のページから引用、正規表現の説明を求めていました

リストにある1文字に一致する[0-9]{1}

{1}数量詞の下 -

0-9 0 (ASCII 48)9 (ASCII 57)(大文字と小文字を区別)との間の範囲内の単一の文字が

$は、文字列の末尾位置をアサート正確に一つの時間(無意味な数量詞)と一致、または文字列の最後にある行終端文字の直前

+0

助けてくれてありがとう、私は動的変数についての前のコメントをたどり、正しい値を得ました。私が理解していないのは、1^^ validnum {1} $です。それは何ですか?それは入力値の長さですか? –

+0

@ZaCkDelaCruz:私の更新を見て、あなたに役立つかどうかを見てください – Inian