41

単純なシェル スクリプトで 2 つの文字列を比較しようとしています。/bin/shの代わりにを使用していましたが/bin/bash、何時間ものデバッグを行った後、sh (実際にはダッシュ) がこのコード ブロックを処理できないことがわかりました。

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

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

4

5 に答える 5

9

スクリプトが「間違った」シェルで実行される可能性があるのはなぜですか? スクリプトの先頭にある標準の sh-bang 行を使用して、それを製品の前提条件にすることができると思います。

#!/bin/bash

ユーザーが別のシェルを使用している場合でも、他のシェルは通常そのまま残ります。

特定のカーネル レベル、または awk の存在が前提条件になるのとまったく同じ方法です。

あなたの特定の質問について、私は両方を信じ、sh文字bash列比較に単一の「=」を使用できるようにします-これはPOSIXの動作です:

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

yes
于 2009-07-07T00:27:25.837 に答える
1

すでに投稿された回答は確かに正しいですが、パラメーターの拡張が同じ目的を果たし、さらに柔軟性が増す場合があることに注意してください。

% 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
%
于 2014-02-15T07:04:31.683 に答える
-3

あなたはawkを使うことができます

awk 'BEGIN{
 string1="test"
 string2="tes1t"
 if(s1==s2){
    print "same string"
 }else{
    print "not same"
 }
}'
于 2009-07-07T01:52:41.987 に答える