Bashスクリプトに次のif
ブロックがあります。
if [ ${PACKAGENAME} -eq kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi
$PACKAGENAME
がkakadu-v6_4-00902C
と等しいにもかかわらず、スクリプトの実行がif
ブロックに入りません。何が悪いのですか?
-eq
は、2つの数値を比較する算術演算子です。
代わりに=
(ポータブル/標準sh
)、=~
または==
を使用してください。
${PACKAGENAME}
に空白またはワイルドカード文字が含まれている場合、複数の引数に分割され、[
に必要以上の引数が表示されるため、引用符も使用します。一般的なbashの落とし穴のリスト こちら を参照してください。
if [ "${PACKAGENAME}" = 'kakadu-v6_4-00902C' ]; then
echo "successfully entered if block!!"
fi
man bash
を参照、検索(/) CONDITIONAL EXPRESSIONS
の場合。
置換-eq
と==
したがって、ifブロックは次のようになります:-
if [ ${PACKAGENAME} == kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi
別の方法はそれらを否定することです:
: ${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