オプション1

オプション1

$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

ベストアンサー1

素晴らしい、

if [ "$1" == "" ] || [ $# -gt 1 ]; then
        echo "Parameter 1 is empty"

まず、=代わりにを使用してください==。前者は標準であり、後者は bashistic です (たとえ ksh からも出たものだと思います)。第二に、ここの論理は正しくありません$#より良い1の場合、パラメータ1は空にすることはできません(ただし、空の文字列に設定できます)。たぶんあなたはそういう意味かもしれませんが"$#" -lt 1、それもそういう意味かもしれません"$1" = ""。テスト[ "$1" = "" ]も十分です[ "$#" -lt 1 ]

elif [! "${#timestamp}" -gt 10 ]; then

ここで、シェルは[!(文字通り)というコマンドを実行しようとします。の間にスペースが必要なので、[ ! "${#timestamp}" -gt 10 ]同じです。[ "${#timestamp}" -le 10 ]たとえば、正確に10文字の文字列もキャプチャします2018-08-14

たぶんあなたは欲しいでしょう[ "${#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

abcdefghijこれは、長さが10文字でも同じパラメータを拒否します。

おすすめ記事