我有以下bash脚本
aws s3 sync s3://test/ s3://test-li/
if [[ ! $? -eq 0 ]]; then
echo "Unable to copy from test bucket"
exit 1
fi
这是运行命令并检查其返回值的正确方法吗?
答案 0 :(得分:4)
您的代码将起作用,但任何好的shell脚本都会声明shell应该解释它。您应该添加脚本的第一行(左边距没有空格)
#!/bin/bash
(或者在您的环境中使用bash的正确路径)。 99%是/bin/bash
。
您的测试稍微有点巴洛克式,您可以使用-ne
运算符,即
if [[ $? -ne 0 ]] ; then
. . .
或者你可以先进,让if
直接测试你aws
命令的返回码,即
if ! aws sync s3://test/ s3://test-li/ ; then
echo "Unable to copy from test bucket"
exit 1
fi
在这种情况下,您需要!
来执行块。
您甚至可以捕获任何输出,以便您可以使用
查看错误消息等if ! aws sync s3://test/ s3://test-li/ > /tmp/aws_launchlog.txt 2>&1 ; then
echo "Unable to copy from test bucket"
exit 1
fi
IHTH
答案 1 :(得分:3)
与大多数其他语言不同,在像bash这样的shell中,if
语句后跟一个命令,括号愚弄你。 [[
实际上是一个shell关键字(就像!
),[
的开发,它是一个内置的shell,也称为test
命令。
当您希望进行模式匹配时使用[[
,当您希望进行算术比较时,请使用((
。
if (( some_variable > 0 ))
then
...
fi
如果你只想测试命令是否有效(返回零),那么任何形式的括号都是多余的。
if ! aws s3 sync s3://test/ s3://test-li/
then
# Always send error messages to stderr
echo "Unable to copy from test bucket" >&2
exit 1
fi
话虽如此,在野外有成千上万的脚本可以完成你所做的事情,而且它们仍在工作。不幸的是
答案 2 :(得分:1)
你的方式会奏效。更简单的方法是将命令直接放在if
:
if ! aws s3 sync s3://test/ s3://test-li/
then
echo "Unable to copy from test bucket"
exit 1
fi
答案 3 :(得分:0)
bash的set -e
非常有用。
#!/bin/bash
set -e
aws s3 sync s3://test/ s3://test-li/
# if `aws` returns non-zero, the following code will not be executed
echo 'it succeeded!'