最初のコマンドライン引数($1
)の最小文字数は10文字で、空の場合。
スクリプトは次のように呼び出されます。
./myscript.sh 2018-08-14
私はこれを試しましたが、うまくいきません
timestamp="$1"
# check if command line argument is empty or not present
if [ "$1" == "" ] || [ $# -gt 1 ]; then
echo "Parameter 1 is empty"
exit 0
Elif [! "${#timestamp}" -gt 10 ]; then
echo "Please enter at least a valid date"
echo "Example: 2018-08-14"
exit 0
else
echo "THIS IS THE VALID BLOCK"
fi
上手、
if [ "$1" == "" ] || [ $# -gt 1 ]; then echo "Parameter 1 is empty"
まず、=
ではなく==
を使用します。前者は標準、後者はバシズムです(私はそれもkshからのものだと思います)。次に、ここのロジックは正しくありません。$#
がより大きい 1の場合、パラメータ1はおそらく空ではありません(ただし、空の文字列に設定されている可能性があります)。おそらく、あなたは"$#" -lt 1
を意味していたかもしれませんが、それは"$1" = ""
も意味します。 [ "$1" = "" ]
または[ "$#" -lt 1 ]
をテストするだけで十分です。
Elif [! "${#timestamp}" -gt 10 ]; then
ここで、シェルは[!
(文字通り)というコマンドを実行しようとします。間にスペースが必要なので、[ ! "${#timestamp}" -gt 10 ]
。ただし、これは[ "${#timestamp}" -le 10 ]
と同じで、2018-08-14
のように、正確に10文字の文字列もキャッチします。
ですから、[ "${#timestamp}" -ne 10 ]
が必要かもしれません。 (文字列比較であっても、!=
ではなく-ne
も機能します。)
if ... exit 0
エラーが発生した場合はゼロ以外の終了コードで戻るのが慣例なので、エラーブランチでexit 1
を使用します。
case
または[[ .. ]]
を使用して、引数を予期される形式とパターン照合することもできます。例:
case "$1" in
"")
echo date is empty
exit 1;;
[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])
echo date is ok;;
*)
echo "date is _not_ ok"
exit 1;;
esac
また、10文字の長さであっても、abcdefghij
のような引数は拒否されます。
以下のスクリプトを試してください。
timestamp="$1"
# check if command line argument is empty or not present
if [ -z $1 ]; then
echo "Parameter 1 is empty"
exit 0
Elif [ "${#timestamp}" -lt 10 ]; then
echo "Please enter at least a valid date"
echo "Example: 2018-08-14"
exit 0
else
echo "THIS IS THE VALID BLOCK"
fi
[[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1"