変数を文字列と比較するにはどうすればよいですか(一致する場合は何かを実行します)?
変数を文字列と比較するにはどうすればよいですか(一致する場合は何かを実行します)?
回答:
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
あなたは、彼らが一致していない何かをしたい場合は、交換してください=
と!=
。文字列演算と算術演算の詳細については、それぞれのドキュメントを参照してください。
$x
ですか?$x
空の場合、Bashスクリプトで以下のように構文エラーが発生するため、引用符で囲みます。
if [ = "valid" ]; then
==
演算子の非標準的な使用Bashはとの==
等価に使用できます[
が、これは標準ではないことに注意してください。
前後の引用符$x
がオプションである最初のケースを使用します。
if [[ "$x" == "valid" ]]; then
または2番目のケースを使用します。
if [ "$x" = "valid" ]; then
[ "$1" == "on" ]
。これを["$ 1" = "on"]に変更すると、問題が解決しました。
=
はなく1つにする必要があります。
[ $x -eq "valid" ]
。-eq
文字列ではなく整数の比較演算子です。
["x$yes" == "xyes"]
は、変数と文字列リテラルの両方の前にx
?それは昔の遺物ですか、それともいくつかの状況で本当に必要ですか?
または、else句が必要ない場合:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
echo
失敗する可能性があるため、これは通常悪い考えです。
[ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid"
。
{ echo invalid && false; }
は( echo invalid && false )
、不要なサブシェルへの支払いを回避するため、よりも効率的です。
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
と[
して]
重要であり、>
および<
はリダイレクト演算子であるため、文字列\>
で\<
それぞれエスケープします。$a
実際に" "
囲まれていたため、エスケープ文字を使用し$b
て値を比較する必要がありました。実行後にこれを見つけることができましbash -x ./script.sh
た。-xフラグを使用すると、各実行の値を確認でき、デバッグに役立ちます。
文字列とワイルドカードを比較するには
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
"
ワイルドカードの周りの欠落にも注意してください。(ところで:ワイルドカードの場合は+1!)
$stringB
は引用符で囲む必要があります(偶然にも、左側を引用符で囲む必要はありません)if [[ $stringA = *"$stringB"* ]]; then
。
私は一点でコメントの1つに同意しなければなりません:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
それはただのようです、うーん、初心者...
ある意味、言語として一般的なパターンを使用しています。
そしてあなたが言語を学んだ後。
これは、論理演算子の遅延評価という1つの特別な部分を持つ単純な論理式です。
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
各部分は論理式です。最初の2つはtrueまたはfalseで、他の2つは常にtrueです。
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
今、それが評価されるとき、最初がチェックされます。それはロジックの第二オペランドよりも、偽の場合と &&
した後、それは関係ありません。最初のものは真実ではないので、とにかくそれが最初のものであり、2番目のものが真であることはありえません。
ここで、この場合はロジックの最初の側 または ||
falseですが、反対側(3番目の部分)がtrueの場合はtrueになる可能性があります。
したがって、3番目の部分が評価されます-主に副作用としてメッセージを書き込む。(0
true の結果がありますが、ここでは使用しません)
他のケースも同様ですが、単純です-そして-私は約束します!ある-できる-読みやすい!
(私は持っていませんが、灰色のひげを持つUNIXのベテランであることは、これで多くの助けになると思います。)
... && ... || ...
通常時に難色され、それが意味的に等価ではないとして、(ごめん老いUnixのベテラン、あなたはすべてのこの時間のために間違ってました)if ... then ... else ...
。心配しないでください。これはよくある落とし穴です。
... && ... || ...
完全に有効なパターンであり、一般的なbashイディオムです。これを使用すると事前の知識が規定されますが(オーディエンスに初心者がいる場合は覚えておくとよいかもしれません)、OPには、開いたマンホールの蓋を回避する方法を知っていることを証明するための毛があります。
ユースケース/ esacを使用することもできます
case "$string" in
"$pattern" ) echo "found";;
esac
|
前に、で区切られたパターンがあることに注意してください)
。このin
ステートメントは、then
in ステートメントと同等if
です。あなたがPythonから来た場合、各リストが何をすべきかについての独自の宣言を持っているパターンのリストに対して機能することを主張することができます。好きsubstring in string
ではなく、むしろfor item in list
。条件*
が必要な場合は、最後のステートメントとしてa を使用しますelse
。最初の出会いに戻ります。
次のスクリプトは、「testonthis」という名前のファイルから1行ずつ読み取り、各行を単純な文字列、特殊文字を含む文字列、および正規表現と比較します。一致しない場合、スクリプトは行を印刷します。それ以外の場合は一致しません。
バッシュのスペースはとても重要です。したがって、以下が機能します:
[ "$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
bash
が、[
実際には外部バイナリであるので(のwhich [
ようなものが生成されます/usr/bin/[
)
入力に有効なエントリが少ししかない場合、おそらく正規表現一致を使用します。たとえば、「開始」と「停止」のみが有効なアクションです。
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
$ACTION
二重コンマを使用して変数を小文字にしています。また、これは古すぎるbashバージョンでは機能しないことに注意してください。
Bash 4+の例。注:引用符を使用しないと、単語にスペースなどが含まれている場合に問題が発生します。常にBash、IMOで引用してください。
以下は、Bash 4+の例です。
例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
楽しい。
if [ "$a"="$b" ]
か、それは仕事が...等号の周りにスペースを入れることはできませんしません