5

入力したスクリプトを実行する前に

# export CPIC_MAX_CONV=500

以下はtest1.scriptファイルです

#!/bin/bash

function cpic () {
  var="`export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } '`"
  [[ $var=="" ]] && (echo "Empty String <<")
  [[ $var!="" ]] && (echo "$CPIC_MAX_CONV")
  echo "$var" ;
}

cpic

出力は次のとおりです。

# test1.script  ---- Me running the file

Empty String <<
500
CPIC_MAX_CONV="500"

「」または「」または[または[[を使用しても、結果は同じです。CPIC_MAX_CONV変数は上記のスクリプトによって検出されます。

私はこれをLinux/CentOS6.3で実行しています。

考え方は単純ですCPIC_MAX_CONV。環境で定義されているかどうかを確認し、その値を返すことです。空のスペースがある場合は、もちろん変数はシステムに存在しません。

4

4 に答える 4

4

なぜあなたはいつも真実になるのですか?最初に端末で少し遊んでみましょう:

$ [[ 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変数を使用するつもりはないので、キーワードを使用しました。varcpic

さて、関数の目的、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
}

同様に行います!

于 2012-12-24T20:58:51.830 に答える
1

CPIC_MAX_CONV が環境変数なのか、単に「環境変数である可能性のある変数なのか」ということを本当に気にしますか? ほとんどの場合、それが環境変数ではなく変数である場合、実行するスクリプトは値を認識しないため、そうはなりません (ただし、エイリアスと関数を使用することを主張する場合は、問題になる可能性がありますが、それでもおそらくしないだろう)。

CPIC_MAX_CONV が空でない値に設定されているかどうかをテストしようとしているようです。それを行うには複数の簡単な方法があります — そして、あなたが試した方法があります。

: ${CPIC_MAX_CONV:=500}

これにより、CPIC_MAX_CONV が空でない値に設定されます。以前に値が設定されていなかった場合は、500 が使用されます。(:コロン) コマンドはその引数を評価し、成功を報告します。必要に応じて、作成後に変数をエクスポートするように手配できますexport CPIC_MAX_CONV

変数を設定する必要がある場合 (適切なデフォルトはありません)、次を使用します。

: ${CPIC_MAX_CONV:?}

また

: ${CPIC_MAX_CONV:?'The CPIC_MAX_CONV variable is not set but must be set'}

違いは、デフォルト メッセージ (「CPIC_MAX_CONV: パラメータが null または設定されていない」) を使用するか、独自のメッセージを指定できることです。

値を 1 回だけ使用する場合は、コマンドで次のように「オンザフライ」置換を行うことができます。

cpic_command -c ${CPIC_MAX_CONV:-500} ...

:=これは、存在する表記とは異なり、存在しない場合は変数を作成しません。

これらすべての表記法では、操作の一部としてコロンを使用しています。これにより、「null または not set」が強制されます。コロンは省略できますが、これにより空の文字列が有効な値として許可されますが、これはおそらく必要なものではありません。空白だけで構成される文字列は「空ではない」ことに注意してください。空でない文字列を取得したことを検証する必要がある場合は、もう少し努力する必要があります。


[[コマンドの誤用を分析しているわけではありません。gniourf_gniourfは、その優れた脱構築を提供しましたが、仕事と思われることを行うために利用できるより単純な表記を見落としていました。

于 2012-12-24T21:48:17.680 に答える
0

これを試して:

#!/bin/bash
function cpic () {    
  var="`export | grep -i "CPIC_MAX_CONV"`"
  [ "$var" = "" ] && (echo "Empty String <<")
  [ "$var" != "" ] && echo "$CPIC_MAX_CONV"
}  
cpic
于 2012-12-25T19:03:26.927 に答える
-1

条件にスペースが必要です。

#!/bin/bash

function cpic () {
    var="`export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } '`"
    [[ $var == "" ]] && (echo "Empty String <<")
    [[ $var != "" ]] && (echo "$CPIC_MAX_CONV")
    echo "$var" ;
}

cpic
于 2012-12-24T22:02:02.250 に答える