((...))文字列比較を含むifステートメントはbashスクリプトでは機能しません。

((...))文字列比較を含むifステートメントはbashスクリプトでは機能しません。

私は次のスクリプトを書いた。

#!/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((?

おすすめ記事