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
cut
IPの詳細を取得するために区切りコマンドを使用しています。 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_addr
ip_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 )