编写成功的bash脚本

时间:2015-12-12 00:17:47

标签: bash

我有以下bash脚本

aws s3 sync s3://test/ s3://test-li/

if [[ ! $? -eq 0 ]]; then
   echo "Unable to copy from test bucket"
   exit 1
fi

这是运行命令并检查其返回值的正确方法吗?

4 个答案:

答案 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!'