web-dev-qa-db-ja.com

コマンドライン引数を確認する

最初のコマンドライン引数($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
4
user305422

上手、

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のような引数は拒否されます。

6
ilkkachu

以下のスクリプトを試してください。

オプション1

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

オプション2

[[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1"
2
Stack EG