コマンドがnullまたは出力を提供しないかどうかをテストするために使用される条件

コマンドがnullまたは出力を提供しないかどうかをテストするために使用される条件

AIXの各LPARに対して、HMCでIPアドレス収集を実行しています。

$ lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version --filter lpar_names=ABCD123
ABCD123:Not Activated::Unknown
$ lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version --filter lpar_names=ABCD456
ABCD456:Running:10.8.34.21:VIOS 2.2.5.20

cutIPの詳細を取得するために区切りコマンドを使用しています。 IP以外の値は出力データではありません。

$ lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version --filter lpar_names=ABCD123 | cut -d : -f3
10.8.34.21
$ lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version --filter lpar_names=ABCD456 | cut -d : -f3

一部のサーバーのIPアドレスは利用できません。不明な値を割り当てるためにnullまたは出力のないコマンドを無視するようにifコマンドに指示する方法

この条件をテストして価値のないデータを取得する方法を教えてください。次の変数を割り当てることができます。ipaddr=unknown

答え1

for name in ABCD123 ABCD456; do
    ip_addr=$( lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version --filter lpar_names="$name" | cut -d : -f 3 )

    printf 'Got IP address "%s" for lpar name "%s"\n' "${ip_addr:-unknown}" "$name"
done

空の場合、または変数が設定されていない場合(ここでは常に値に設定されていますが空になる場合があります)、パラメータ拡張は${ip_addr:-unknown}文字列に展開され、そうでない場合は変数値に拡張されます。unknown$ip_addrip_addr

答え2

bash付属のデフォルトパラメータ拡張を使用してください。

ipaddr="$(lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version --filter lpar_names=ABCD123 | cut -d : -f3)"
echo "${ipaddr:-unknown}"

まず、サブシェル構成を使用して$( command )出力をキャプチャしcommand、それを変数に割り当てます。関連コマンドに yours が含まれているため、cutコマンドが IP アドレスを返さない場合、期待どおりに正しく null になります。

次に、設定されていないか空の場合は、指定された${var:-default}デフォルト値に拡張されるコンストラクタを使用します。var

変数を複数回参照する場合は、デフォルトの割り当てを使用することもできます。置く変数が null に設定されていない場合、変数の値はデフォルト値に設定されます。

$ echo "$foo"

$ echo "${foo:=bar}"
bar
$ echo "$foo"
bar

または、スクリプトが設定されていないか空の場合は、スクリプトを停止してエラーを発生させます。

$ echo "${bar:?bar is unset or empty}"
-bash: bar: bar is unset
$ echo $?
1

答え3

これを行う方法はいくつかあります。 1つの技術は次のとおりです。

ipaddr=$( lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version \
    --filter lpar_names=ABCD123 | cut -d : -f3 | grep . || echo unknown )

関連情報