この変数があります
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つがない場合のみキャプチャしたものなので、しかも数字に加えて他の文字もあります。つまり、abc
and は通過して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
答え2
最初のケースの「実際の」ケースでは何も説明しませんif
。
if ( [ $# -eq 2 ] )
then
## <-- HERE
elif ...
bashのマニュアルを引用すると、次のようになります。
if コマンドの構文は次のとおりです。
if test-commands; then consequent-commands; [elif more-test-commands; then more-consequents;] [else alternate-consequents;] fi
重要な点はですconsequent-commands
。