質問

私は、単純なシェルスクリプトに2つの文字列を比較しようとしています。 私は/bin/sh代わりの/bin/bashを使用していた、とデバッグの数え切れないほどの時間の後に、それは(実際にはダッシュで)SHはコードブロックを処理することはできませんが判明します:

if [ "$var" == "string" ]
then
    do something
fi

/bin/shを使用して文字列を比較するポータブルな方法は何ですか?私はいつも使用して反対を行うことができます知っている!=が、私はクリーナー、ポータブルな方法について疑問に思ってます。

役に立ちましたか?

解決

dashは非常に厳格なPOSIXシェルは、それがdashで作業する場合、他のPOSIXシェルで機能するであろうほぼ確実である。

試します:

if [ "$var" = "string" ]
then
    some_command
fi

他のヒント

なぜ、あなたのスクリプトは、「間違った」シェルによって実行される可能性さえあるのでしょうか?私はあなたのスクリプトの先頭に標準SH-バンラインを使用して、製品の前提条件を作ることができると思うだろう。

#!/bin/bash
ユーザーはの別のシェルを使用している場合でも、

、他のシェルは、まだそこに一般的であり、、ない場合は、単に彼らが事前-REQであることを訴えると状態。

特定のカーネル・レベル、またはAWKの存在は、事前REQとすることができることを全く同じ方法

あなたの具体的な質問については、私はshbashの両方を単一の「=」文字列の比較のために使用することが可能と考えている - それは、POSIXの動作です。

if [ "a" = "a" ] ; then
    echo yes
fi

yes

の代わりに===を使用してください。比較試験(1)によって処理されます。 /usr/bin/[は通常/usr/bin/testへのリンクです。唯一の違いは、シェルスクリプトで[を使用している場合、]も同様に必要とされることである。

それは実際にtestを使用しないようです。

、そのbashが内蔵されてい[ / /usr/bin/test注意

すでに掲載の答えは確かに正しいですが、おそらく、いくつかの追加の柔軟性と同じ目的を果たすことができる時折パラメータ展開を注意することは価値があるかもしれません。

% p() { printf 'notvar = %b\n' "${notvar##"${string1}"}${string2}" ; }
% string1='some stuff about things\c'
% string2='some different stuff maybe'
% notvar="$string1" p
> 'some different stuff maybe'
% notvar="$string2" p
> 'some stuff about things'

オクラホマので、上記のように超便利ではありませんが、また、(...程度に)必要な場合は、インラインで、ヒアドキュメント内の変数の割り当てをテスト変数のための同様の方法を使用することができることを考えます、あるいは単にあなたの最初の文を書くの短い(と速い!)手段としてます。

[ ! "${var##"string"}" ] && _MATCH || _NOMATCH

あるいは...

[ ${#var#*"${s=string}"} -lt ${#var} ] && _SUB_STRING_TEST=TRUE

可能性も...。

% p() { printf '%s is %s of %s' "$2" "${var_chk-not}" "$1"
> }<<HEREDOC
> ${in="${1##*"${2}"*}"}
> ${in:-
>     ${in="${1##"${2}"}"}
>     ${in:-${var_chk=all}
>     ${var_chk=some}
> }
> HEREDOC
%

は、

のawkを使用することができます
awk 'BEGIN{
 string1="test"
 string2="tes1t"
 if(s1==s2){
    print "same string"
 }else{
    print "not same"
 }
}'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top