私は次のスクリプトを書いた。
#!/usr/bin/bash
STR_1="nfosys"
STR_2="Infosys"
if (( $STR_1 == $STR_2 ))
then
echo "Strings are equal"
else
echo "Strings are not equal"
fi
出力を取得します。
root:~/Desktop/user_repo/Demo# bash -x test.sh
+ STR_1=nfosys
+ STR_2=Infosys
+ (( nfosys == Infosys ))
+ echo 'Strings are equal'
Strings are equal
root:~/Desktop/user_repo/Demo#
理想的には、「文字列が同じではない」文を印刷する必要がありますが、「文字列が同じではありません」を印刷する理由を理解できません。
答え1
(( .. ))
算術コンテキストでは、文字列が変数の名前として扱われ、その変数の値が使用される算術構文です。これは$var
拡張拡張後に発生するため、スクリプトは変数と呼ばれるnfosys
変数を確認しますInfosys
。両方の変数が設定されていない場合、両方ともゼロです。つまり、同じです。しかし:
$ str1=foo str2=bar foo=1
$ (( $str1 == $str2 )) && echo true || echo false
false
たとえば、参照してください。Bash シェル算術マニュアル:
シェル変数はオペランドとして受け入れられます。パラメータ拡張は式の評価前に行われます。式内では、シェル変数はパラメーター拡張構文を使用せずに名前で参照することもできます。 nullまたは設定されていないシェル変数は、パラメータ拡張構文を使用せずに名前で参照すると0に評価されます。
文字列比較の場合は、次のようにします。
[ "$STR_1" = "$STR_2" ] # in any POSIX shell, or
[[ $STR_1 = "$STR_2" ]] # in Bash/ksh/zsh
以前の単語分割には引用符が必要なので$STR_2
、後者はパターンと見なされないように右側(bash / ksh)でのみ必要です。
また見なさい:Bash 演算子[[ vs [ vs ( vs((?
答え2
代わりにそれを使用すると、[]
目的のアクションが生成されます。
STR_1="nfosys"
STR_2="Infosys"
if [ $STR_1 = $STR_2 ]
then
echo "Strings are equal"
else
echo "Strings are not equal"
fi
出力:
+ STR_1=nfosys
+ STR_2=Infosys
+ '[' nfosys = Infosys ']'
+ echo 'Strings are not equal'
Strings are not equal
経験的に良いルールは、変数が誤って解釈されたり拡張/分割されたりする場合に備えて、変数も引用することです。
STR_1="nfosys"
STR_2="Infosys"
if [ "$STR_1" = "$STR_2" ]
then
echo "Strings are equal"
else
echo "Strings are not equal"
fi
また、[]
POSIXを考慮しながら[[]]
主な目標がbash
。
編集者注:POSIXは単一です=
。
答え3
みんなありがとうございます。セッションを再開し、単一の角かっこに変更しました。
#!/usr/bin/bash
STR_1="nfosys"
STR_2="Infosys"
if [ $STR_1 == $STR_2 ]
then
echo "Strings are equal"
else
echo "Strings are not equal"
fi
sh test.shを使用して実行するとエラーが発生します。
root@ip:~# sh test.sh
test.sh: 6: [: nfosys: unexpected operator
Strings are not equal
root@ip:~# bash test.sh
Strings are not equal
bashで実行すると、エラーなしで正しい出力が表示されます。
root@ip:~# bash test.sh
Strings are not equal
奇妙なことは、質問を投稿する前にsh / bashと()/ []の2つの方法を試したことです。しかし、セッションを再開した後は正常に動作するようです。
エディタを更新するためのコードは、POSIXといくつかの良い内容(小文字の変数名、stderrに印刷されたエラー、==
解決された主な問題など)に従います。
#!/bin/sh
str_1=nfosys
str_2=Infosys
if [ "$str_1" = "$str_2" ]; then
echo "Strings are equal"
else
echo "Strings are not equal" >&2
exit 1
fi