なぜあなたはいつも真実になるのですか?最初に端末で少し遊んでみましょう:
$ [[ hello ]] && echo "True"
アウトプットは何だと思いますか?(試してみてください!)そして、次のように?
$ [[ "" ]] && echo "True"
(それを試してみてください!)。
空でない文字列は真の式に相当し、空の文字列 (または設定されていない変数) は偽の式に相当するようです。
あなたがしたことは次のとおりです。
[[ $var=="" ]]
と
[[ $var!="" ]]
あなたは空でない文字列を与えました。これは本当です!
テストを実行するには、実際にはトークン間にスペースが必要です。
[[ $var == "" ]]
代わりは。さて、あなたのテストは次のように書かれた方が良いでしょう:
if [[ -z "$var" ]]; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
(サブシェルなしで、1 つのテストのみ)。
あなたのスクリプト スタイルについては、他にも言いたいことがあります。気分を害することなく、私はそれが本当に悪いと言うでしょう:
バッククォートを使用しないでください。$(...)
代わりに構文を使用してください。したがって:
var="$(export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } ')"
function blah
関数の定義には使用しないでください。関数は次のように定義されている必要があります。
cpic () {
local var="$(export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } ')"
if [[ -z "$var" ]]; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
}
関数の外でlocal
変数を使用するつもりはないので、キーワードを使用しました。var
cpic
さて、関数の目的、cpic
特に変数を定義しているものの目的は何var
ですか? 説明するのは難しいでしょう (考えもしなかったケースが非常に多いため)。(ところで、あなたgrep
はここでは本当に役に立たないようです)。見落としているいくつかのケースを次に示します。
- エクスポートされた変数に名前が付けられます
somethingfunnyCPIC_MAX_CONVsomethingevenfunnier
エクスポートされた変数には、CPIC_MAX_CONV
どこかに文字列が含まれています。
export a_cool_variable="I want to screw up Randhawa's script and just for that, let's write CPIC_MAX_CONV somewhere here"
わかりました、あなたの行が正確に何をしているのかを説明したくはありませんが、あなたの目的は、変数CPIC_MAX_CONV
が設定され、エクスポート用にマークされているかどうかを知ることだと思いますよね? その場合、これだけで良いでしょう:
cpic () {
if declare -x | grep -q '^declare -x CPIC_MAX_CONV='; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
}
それはより効率的で、はるかに堅牢です。
ああ、私は今あなたの投稿の最後を読んでいます。変数が設定されているかどうかだけを確認したい場合CPIC_MAX_CONV
(空でない値に — エクスポート用にマークされているかどうかは気にしないようです。間違っていたら訂正してください)、さらに簡単です (そして、はるかに効率的です):
cpic () {
if [[ "$CPIC_MAX_CONV" ]]; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
}
同様に行います!