用于测试命令是否给出 null 或无输出的 If 条件

用于测试命令是否给出 null 或无输出的 If 条件

我在 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 地址不可用。我如何告诉 if 命令忽略具有 null 或无输出的命令来分配未知值

您能否告诉我如何使用测试此条件来获取无值数据我可以分配一个变量,例如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}"

首先,我们使用子 shell 构造$( 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

答案3

有很多方法可以做到这一点。一种技术是:

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

相关内容