2017-03-26 1 views
0

年が正確な4桁の数字でない場合は、エラーをスローするスクリプトに取り組んでいます。正確な年をbashスクリプトで選択する

これまでのところ、私は以下のコードを持っていますが、唯一の問題はそれが4桁に制限したい4より多くの桁を受け入れることです。

#!/bin/bash 

read -p "Enter year " y 
while [[ -z $y || $y =~ [A-Za-z]+ || ! $y =~ [0-9]{4} ]]; do 
      read -p "Enter the year in a valid format [yyyy] " y 
done 
echo "Selected year is: $y" 

出力 -

Enter the year in a valid format [yyyy] vrgege 
Enter the year in a valid format [yyyy] vegter 
Enter the year in a valid format [yyyy] 123 
Enter the year in a valid format [yyyy] 12345 
Selected year is: 12345 

それ未満4桁の数字を受け入れていないが、それは以上の4桁の数字を受け入れます。

誰かが提案することができます、どのように正確にわずか4桁を取得する条件を置く?

+1

私の意見では、これは削除できます: '-z $ y || $ y =〜[A-Za-z] + || ' – Cyrus

答えて

3

だけ正確な4桁の数字に一致するように

^[0-9]{4}$ 

によって

[0-9]{4} 

を交換してください。


参照:bashismsなしThe Stack Overflow Regular Expressions FAQ

+2

または==演算子を含むグロブパターンを使用します:' $ y == [0-9] [0-9] [0-9] [0-9] 9] ' –

+0

はい、それも可能です。 – Cyrus

+0

^と$が期待どおりに動作しました。ありがとう@Cyrus – Kshitij8097

0

、移植性のために、私はあなたが希望する場合にも(...|...|...|...)でこれらを組み合わせることができます

case $y in 
([0-9][0-9][0-9][0-9]) 
    printf "A four digit year, OK\n" 
    ;; 
([0-9][0-9][0-9]) 
    printf "A three digit year, OK\n" 
    ;; 
([0-9][0-9]) 
    printf "A two digit year, OK\n" 
    ;; 
([0-9]) 
    printf "A one digit year, OK\n" 
    ;; 
(*) 
    printf "NOT OK\n" 
esac 

を示唆しています。

関連する問題