変数と文字列を比較するにはどうすればよいですか(それらが一致する場合は何かをします)。
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
一致しないときに何かしたい場合は、=
を!=
に置き換えます。 文字列演算 および 算術演算 についての詳細は、それぞれのドキュメントで読むことができます。
$x
を引用符で囲むのはなぜですか?空の場合、bashスクリプトに以下のような構文エラーが発生するため、$x
を囲む引用符が必要です。
if [ = "valid" ]; then
==
演算子の非標準的な使い方bash
は==
を[
との等価性のために使うことを可能にしますが、 これは標準ではありません .
$x
を囲む引用符がオプションである最初のケースを使用してください。
if [[ "$x" == "valid" ]]; then
または2番目のケースを使用します。
if [ "$x" = "valid" ]; then
または、else句が不要な場合は、
[ "$x" == "valid" ] && echo "x has the value 'valid'"
文字列とワイルドカードを比較するには
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
a="abc"
b="def"
# Equality Comparison
if [ "$a" == "$b" ]; then
echo "Strings match"
else
echo "Strings don't match"
fi
# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
echo "$a is lexicographically smaller then $b"
Elif [ "$a" \> "$b" ]; then
echo "$b is lexicographically smaller than $a"
else
echo "Strings are equal"
fi
ノート:
if
と[
と]
の間のスペースは重要です>
と<
はリダイレクト演算子なので、文字列に対してはそれぞれ\>
と\<
でエスケープします。私は一点でコメントの1つに同意しない必要があります。
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
それはちょうどそれが1つのように見える、うーん、初心者...
ある意味では、言語として一般的なパターンを使います。
そしてあなたが言語を学んだ後。
これは単純な論理式であり、特別な部分が1つあります。それは論理演算子の遅延評価です。
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
各部分は論理式です。最初のものは真か偽かもしれません、他の2つは常に真実です。
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
さて、それが評価されるとき、最初のものがチェックされます。それが偽であれば、論理の2番目のオペランド および &&
の後には関係ありません。最初のものは真実ではないので、とにかく、それは最初のものであることはできず、2番目のものは真実であることはできません。
さて、この場合、論理の最初の側は または ||
falseですが、反対側(3番目の部分)が真であれば真実かもしれません。
したがって、3番目の部分が評価されます - 主に副作用としてメッセージを書くことです。 (trueの場合は0
という結果になります。ここでは使用しません)
他のケースも似ていますが、もっと単純です - そして - 私は約束します!読みやすいです。
(私は持っていませんが、あごひげを生やしたUNIXのベテランであることは、これに非常に役立ちます。)
ユースケース/ esacも使えます
case "$string" in
"$pattern" ) echo "found";;
esac
次のスクリプトは、 "testonthis"という名前のファイルから1行ずつ読み取り、各行を単純な文字列、特殊文字を含む文字列、および正規表現と比較します。
bash内のスペースはとても重要です。だから以下がうまくいくでしょう
[ "$LINE" != "table_name" ]
しかし、フォローはしません:
["$LINE" != "table_name"]
そのまま使用してください。
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
入力に有効なエントリがわずかしかない場合は、おそらく正規表現の一致を使用します。例えば。有効なアクションは "start"と "stop"だけです。
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
二重コンマを使って変数$ACTION
を小文字にしていることに注意してください。また、これはあまりにも古くなったbashバージョンでは動作しません。
Bash4 +の例注:単語にスペースなどが含まれていると、引用符を使用しないと問題が発生します。常にbash IMOで引用してください。
以下はBASH4 +の例です。
例1、文字列内の 'yes'をチェックします(大文字と小文字は区別されません)。
if [[ "${str,,}" == *"yes"* ]] ;then
例2、文字列内の 'yes'をチェックします(大文字と小文字は区別されません)。
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
例3、文字列内の 'yes'をチェックします(大文字と小文字を区別):
if [[ "${str}" == *"yes"* ]] ;then
例4、文字列内の 'yes'をチェックします(大文字と小文字を区別):
if [[ "${str}" =~ "yes" ]] ;then
例5、完全一致(大文字と小文字を区別):
if [[ "${str}" == "yes" ]] ;then
例6、完全一致(大文字と小文字は区別されません):
if [[ "${str,,}" == "yes" ]] ;then
例7、完全一致
if [ "$a" = "$b" ] ;then
楽しい。
私はこのようにして、bash、dash(sh)と互換性があるようにしました。
testOutput="my test"
pattern="my"
case $testOutput in (*"$pattern"*)
echo "if there is a match"
exit 1
;;
(*)
! echo there is no coincidence!
;;esac