空のメッセージ文字列を検出するBashスクリプト。インポート:引数が多すぎます。

空のメッセージ文字列を検出するBashスクリプト。インポート:引数が多すぎます。

他のアプリケーションの出力を下のスクリプトにパイプするbashスクリプトがあります。しかし、メッセージが空であるかどうかをテストするロジックが正しくないと思います。空の場合は何もしないことを望んでいますが、文字列で「error」という単語を検出した場合は、他の機能を実行する必要があります。

私のロジックに何の問題がありますか?

3番目から最後の行まで、あまりにも多くのパラメータを受信して​​います。これは空のメッセージが原因である可能性が高いです。

message=$( cat )

if [ -n "${message// /}" ]; then
  #execute if the the variable is not empty and contains non space characters
  message="\`\`\` ${message} \`\`\`"
else
  #execute if the variable is empty or contains only spaces
  message=""
fi

sendX() {
.....
}

if  [ -z "$message" ]; then
        echo "Please pipe a message to me!"
else
        sendX
fi

sendAlert() {
......
}

checkword="error"

echo $message

if [ $message =~ $checkword ]; then  <---- Error: too many arguments
 sendY
fi

ベストアンサー1

[ ... ]正規表現=~の一致に使用される演算子を理解できないため、「引数が多すぎます」エラーが発生します。演算子を理解できbashないため、[ ... ]文字列として扱われます。これにより、[ ... ]正しいテストの意味論的要件を満たさない3つの文字列が内部にあるため、bashこの時点でエラーが発生します。

では内部をbash使用します。=~[[ ... ]]

ただし、そのテストで実行したいことが部分文字列として含まれていることを確認$messageすることを前提としています。$checkwordこれは次の方法で行うこともできます。

[[ "$message" == *"$checkword"* ]] && sendY

または次のようにcase ... esac

case $message in
    *"$checkword"*) sendY
esac

$checkwordこれにより、正規表現に特殊な文字を含めることを心配する必要はありません。

ファイル名ワイルドカード(例$message:。echo $message$message*

関連:


スクリプトの最初の操作の代わりにそれを使用することもできます。

case $message in
    *[!\ ]*) # contains non-space
        message='``` '"$message"' ```' ;;
    *)       # contains nothing or only spaces
        message=
esac

両方の場所で使用すると、case ... esacスクリプト(少なくとも表示される部分)をsh同様のシェルに移植できます。

おすすめ記事