bashの、ダッシュと文字列の比較
-
11-09-2019 - |
質問
私は、単純なシェルスクリプトに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とすることができることを全く同じ方法
あなたの具体的な質問については、私はsh
とbash
の両方を単一の「=」文字列の比較のために使用することが可能と考えている - それは、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"
}
}'