Bash

如果條件來測試命令是否給出 null 或沒有輸出

  • April 24, 2018

我從 AIX 上的 HMC 為每個 LPAR 執行 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 地址不可用。我如何告訴 if 命令忽略具有 null 或沒有輸出的命令以分配未知值

您能否告訴我如何對無值數據使用測試此條件,我可以分配一個變數,例如ipaddr=unknown

使用bash自己的內置預設參數擴展:

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

首先,我們使用 subshel​​l 構造$( command )來擷取 的輸出command,並將其分配給一個變數。由於有問題的命令包含您的cut,因此在您的命令不返回 IP 地址的情況下,它將正確地為 null 。

然後我們使用構造,如果未設置或為空${var:-default},它將擴展為提供的預設值。var

如果您要多次引用該變數,您還可以使用預設分配,如果該變數未設置為空,則該分配也會將該變數的值設置為預設值*:*

$ echo "$foo"

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

或者如果它未設置或為空,則停止您的腳本並引發錯誤:

$ echo "${bar:?bar is unset or empty}"
-bash: bar: bar is unset
$ echo $?
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

引用自:https://unix.stackexchange.com/questions/439779