以下命令将解析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)
如何在变量中保存命令输出,同时检查命令是否成功
你应该使用 $?
而不是$#
.
执行以下操作:
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)
$?
我建议尽可能不要使用,因为它很脆弱并且在重构时很容易被忽视。如果有人在命令和 之间添加一行$?
,脚本将以不明显的方式中断。
如果您想将输出分配给变量并同时检查退出代码,则可以在条件块中执行这两项操作:
if foo="$(echo "foo"; true)"; then
echo "$foo"
fi
echo "$foo"
Run Code Online (Sandbox Code Playgroud)
您可以避免访问$?
,只需:
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)