Bashで2つの文字列を比較する

Bashで2つの文字列を比較する

if私のBashスクリプトには次のブロックがあります。

if [ ${PACKAGENAME} -eq kakadu-v6_4-00902C ]; then
  echo "successfully entered if block!!"
fi

if同じであっても、$PACKAGENAMEスクリプトの実行は私のブロックに入りませんkakadu-v6_4-00902C。私は何が間違っていましたか?

答え1

-eq2 つの数値を比較するために使用される算術演算子です。

=(portable / standard sh=~または代わりに使用してください==

また、${PACKAGENAME}スペースやワイルドカードを含めると、複数の引数に分割され、makeが必要な[ものよりも多くの引数を見ることができるので、引用符を使用してください。バラよりここ一般的なbashトラップのリストです。

if [ "${PACKAGENAME}" = 'kakadu-v6_4-00902C' ]; then
    echo "successfully entered if block!!"
fi

参照man bash、検索(/CONDITIONAL EXPRESSIONS

答え2

ifブロックが次のように見えるように、-eq次のように置き換えます。==

if [ ${PACKAGENAME} == kakadu-v6_4-00902C ]; then

        echo "successfully entered if block!!"

fi

答え3

もう一つの方法はこれを否定することです。

: ${PACKAGENAME:?'$PACKAGENAME variable is empty!'} #emits error and exits
[ -z "${PACKAGENAME#kakadu-v6_4-00902C}" ] || { #if var - str not empty do block
    echo '$PACKAGENAME is not kakadu-v6_4-00902C' 
    exit 1
} >&2

上記のブロックは最初に"$PACKAGENAME"値があるかどうかをテストし、値がない場合はエラーで終了し、?'this'}それをエコーし​​ますstderr。親シェルがまだ存在する場合はテストに合格し、次に変数から文字列 "kakadu..."を削除すると、空の-z文字列が表示されるかどうかをテストします。そうでない場合、エラーが再び発生し、シェルを終了します。この時点でブロック実行後もシェルに何も残っていれば、そうでなければそうではありません。

おそらく、この種のことは関数として実装するのが最善でしょう。良い:

argeq() ( i= : ${2?^MERR: not enough parameters!} #$#>=2 || quit w/ err ^M == \r
    z() { return $((${#1}>0)) ; } #return 1 if ${#1}>0 else 0
    until z "${2+?}" $((i=i+1)) #until $2 is not set...
    do  ! z "$1" && z "${1#"$2"}" || #$1 != '' && $1 - $2 == '' or...
        exit $((i${1:++1})) #exit $? == failed arg count
    shift ; done #shift away one param ; continue loop
)

この関数を使用すると、システムが許可するのと同じ数の引数を提供できます。 2つ未満を指定すると1が返され、メッセージが表示されますstderr。 2つ以上のパラメータを指定した場合は、すべてのパラメータを文字列として処理し、すべてのパラメータが同じでnullでない場合は0を返し、そうでない場合はチェックに失敗した最初のパラメータの数を返します。

あなたの場合は、次のように使用できます。

{   
    PACKAGENAME='kakadu-v6_4-00902C'
    argeq "$PACKAGENAME" kakadu-v6_4-00902C &&
        echo "kakadu-v6_4-00902C == $PACKAGENAME" ||
        echo failure
    ! argeq "${PACKAGENAME#*-}" kakadu-v6_4-00902C &&
        echo "kakadu-v6_4-00902C != ${PACKAGENAME#*-}" ||
        echo failure
}

###OUTPUT###
kakadu-v6_4-00902C == kakadu-v6_4-00902C
kakadu-v6_4-00902C != v6_4-00902C

より詳細に説明するために別の関数を作成します。

aeqecho() { i=$((i+1)) #inc for line#
    argeq "$@" && echo "$i : yay" || #allswell or
    ! e=$? ${2+:} return || #save $?; ! exclusive || to drop ERRs
    echo "$i : shite - arg$e failed" #report failure
}

デモ:

{  i= s=string
   aeqecho $s #1
   aeqecho $s $s #2
   aeqecho "$s $s" #3
   aeqecho "$s $s" "${s} string" #4
   aeqecho "${s}1" $s string #5
   aeqecho "" "" "" #6
   aeqecho "" "$s" $s #7
   aeqecho 1 "${s#$s}1" $((2-1)) #8                     
   aeqecho $s $s $s $s $s $s $s $s $s $s $s $s stng #9  
   aeqecho $s $s $s $s $s $s $s $s $s $s $s $s string #10
}  

出力:

ERR: not enough parameters!
2 : yay
ERR: not enough parameters!
4 : yay
5 : shite - arg2 failed
6 : shite - arg1 failed
7 : shite - arg1 failed
8 : yay
9 : shite - arg13 failed
10 : yay

関連情報