if 文の elif 条件

if 文の elif 条件

この変数があります

start=$1;
end=$2;
sn=${#start}
en=${#end}

場合:

if ( [ $# -eq 2 ] )
then
elif ( [ $sn -ne 3 ] && [ -n "$(printf '%s\n' "$start" | sed 's/[0-9]//g') " ] );
then     
    echo "Incorrect format"
    exit 1
elif ( [ $en -ne 3 ] && [ -n "$(printf '%s\n' "$end" | sed 's/[0-9]//g') " ] );
then
    echo "Incorrect format"
    exit 1
else
    echo "Correct format"
    exit 1
fi

私は最初のエリフに驚きました。ユーザーが提供したパラメーターを確認したかったのですが、パラメーターは3桁でのみ構成できます。

ベストアンサー1

if ( [ $# -eq 2 ] )
then
elif

Jeffの答えが示すように、最初のif条件はコマンド部分が欠落していることです。 BashとDashが提供するエラーメッセージは少しあいまいです。パーサーから直接出てきたように見え、そこにユーザーフレンドリーなメッセージを追加しませんでした。

ブランチ内で何もしない場合は、そこにいくつかのコマンドを追加する必要があります。私はtrueこれが何もしないことを提供する。

この問題を解決し、shellcheck.netより多くの観察が提供されます:

if ( [ $# -eq 2 ] )
   ^-- SC2233: Remove superfluous (..) around condition.

角かっこはここでは不要なサブシェルを起動します(Bashからサブプロセスを分岐するなどの追加のオーバーヘッドが含まれます)。

... [ -n "$(printf '%s\n' "$start" | sed 's/[0-9]//g') " ] 
>>                                                    ^-- 
             SC2157: Argument to -n is always true due to literal strings.

コマンドの置き換えを引用しました。いいね!しかし、最後には余分なスペースがあります。コマンド置換の結果が何であれ-n空白があるため、引数は決して空ではありません。

(また、sumsを引用することを指摘しています$sn。これは注意すべき点ですが、$en数字は含まれていないことを知っていれば実際には必要ありません。)IFS


つまり、条件がまだ適切かどうかはわかりません。あなたは言う:

ユーザーが提供したパラメーターを確認したいのですが、パラメーターは3桁でのみ構成できます。

snただし、以下のテストは3つがない場合のみキャプチャしたものなので、しかも数字に加えて他の文字もあります。つまり、abcand は通過して1234拒否しますabcd。あなたは一つが欲しいまたは条件、、||代わりにそして

if [ $sn -ne 3 ] && [ -n "$(printf '%s\n' "$start" | sed 's/[0-9]//g')" ]; then
    echo reject

caseまたは、次のようにパターンマッチングを使用することもできます。

case "$start" in
    [0-9][0-9][0-9]) echo "'$start' is ok";;
    *) echo "'$start' is invalid"; exit 1;;
esac

おすすめ記事