私は次のスクリプトを書いた。
#!/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((?