在变量上保存命令输出并检查退出状态

Nas*_*asr 8 bash

以下命令将解析google ip

> ip=`dig +short google.com`
> echo $ip
> 216.58.210.238
Run Code Online (Sandbox Code Playgroud)

有时(特别是当互联网连接丢失时)此命令失败并显示此错误

> ;; connection timed out; no servers could be reached
Run Code Online (Sandbox Code Playgroud)

当命令失败并且我使用$#输出为0时为分配

> ip=`dig +short google.com`
> echo $#
> 0
> echo $ip     # Command failed
> ;; connection timed out; no servers could be reached
Run Code Online (Sandbox Code Playgroud)

如何在变量中保存命令输出,同时检查命令是否成功

sjs*_*sam 8

你应该使用 $?而不是$#.

  • $? 包含最后一个脚本的返回值。
  • $#包含传递给脚本或函数的参数总数。

执行以下操作:

ip=$(dig +short google.com)
if [ $? -eq 0 ]; then
  echo "Success" # Do something here
else
  echo "Fail" # Fallback mode
fi
Run Code Online (Sandbox Code Playgroud)


Swi*_*iss 8

$?我建议尽可能不要使用,因为它很脆弱并且在重构时很容易被忽视。如果有人在命令和 之间添加一行$?,脚本将以不明显的方式中断。

如果您想将输出分配给变量并同时检查退出代码,则可以在条件块中执行这两项操作:

if foo="$(echo "foo"; true)"; then
    echo "$foo"
fi

echo "$foo"
Run Code Online (Sandbox Code Playgroud)


Ran*_*ein 7

您可以避免访问$?,只需:

if ip=$(dig +short google.com); then
    # Success.
else
    # Failure.
fi
Run Code Online (Sandbox Code Playgroud)

例:

以下功能将打印“失败”并返回1。

print_and_fail() { printf '%s' fail; return 1; }
Run Code Online (Sandbox Code Playgroud)

因此,如果我们执行以下操作:

if foo=$(print_and_fail); then printf '%s\n' "$foo";fi
Run Code Online (Sandbox Code Playgroud)

我们将没有输出,但将print_and_fail输出存储到$foo-在这种情况下为“失败”。

但是,请看以下函数,它将打印“成功”并返回0。

print_and_succeed() { printf '%s' success; return 0; }
Run Code Online (Sandbox Code Playgroud)

让我们看看现在会发生什么:

$ if foo=$(print_and_succeed); then printf '%s\n' "$foo";fi
$ success
Run Code Online (Sandbox Code Playgroud)