((...))文字列比較を含む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((?

答え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

関連情報