他のアプリケーションの出力を下のスクリプトにパイプする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
*
関連:
- Bash - 構文が混乱している場合
- Bash 演算子[[ vs [ vs ( vs((?
- いつ二重引用符が必要ですか?
- なぜprintfがechoより優れているのですか?
printf '%s\n' "$message"
(echo "$message"
ユーザーが提供したデータよりも便利です) - https://www.shellcheck.net/(これにより、これらの問題はもちろん、正しい行の
#!
欠落などの他の問題も見つかります)
スクリプトの最初の操作の代わりにそれを使用することもできます。
case $message in
*[!\ ]*) # contains non-space
message='``` '"$message"' ```' ;;
*) # contains nothing or only spaces
message=
esac
両方の場所で使用すると、case ... esac
スクリプト(少なくとも表示される部分)をsh
同様のシェルに移植できます。