Bash
如果條件來測試命令是否給出 null 或沒有輸出
我從 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}"
首先,我們使用 subshell 構造
$( 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