Ubuntu 16.04 上的 Amazon CLI bash 脚本,"unexpected operator" if 语句(语法看起来正确)



我正在尝试解决在 Ubuntu Server 16.04 上运行的 Amazon CLI 备份脚本时遇到的问题。

当我手动运行脚本时,我看到我的 if 语句抛出错误。根据请求,我将我的示例减少到最小且可验证。此脚本在另一台生产服务器上运行良好。我还通过 shell 语法检查器运行它,从我可以看到语法看起来正确。我错过了什么?

此外,语法检查器希望我将所有变量括在双引号中。为什么?

错误:

backup.sh: 34: [: Friday: unexpected operator

例:

#!/bin/bash
################
# User Settings:
################
    # your AWS bucket name
    aws_bucket="s3://mybucket"
    # your server path to AWS
    aws_path="/usr/bin/aws"
    weekly_backup_day="Friday"
    # the (2 digit?) date you want your monthly backup run
    monthly_backup_date="01"
################
# Set Date Variables
################
dayOfWeek="$(date +'%A')"
monthNumber=$(date + '%m')
dateOfMonth=$(date '+%d')
################
# Run Weekly
################
if [ $# -lt 1 ] && [ "$dayOfWeek" == "$weekly_backup_day" ] ; then
    echo "Running Weekly"
    $aws_path s3 sync "$aws_bucket"/daily/"$dayOfWeek" "$aws_bucket"/weekly/"$dateOfMonth" --delete
fi
这会

中断:

monthNumber=$(date + '%m')

它必须是

monthNumber=$(date +'%m')

但我怀疑这只是一个错字,因为它会阻止您的错误消息出现。

您可能按如下方式运行它:

sh ./backup.sh

这意味着#!/bin/bash行被忽略,并且运行POSIX模式下的Bash或另一个shell。 ==不是POSIX,所以你必须改变

if [ $# -lt 1 ] && [ "$dayOfWeek" == "$weekly_backup_day" ]

if [ $# -lt 1 ] && [ "$dayOfWeek" = "$weekly_backup_day" ]

或运行它

bash ./backup.sh

或者只是

./backup.sh

考虑:

$ sh -c '[ 1 == 1 ] && echo Yes'      # Can't have "==" in sh
sh: 1: [: 1: unexpected operator
$ sh -c '[ 1 = 1 ] && echo Yes'       # "=" is okay
Yes
$ bash -c '[ 1 == 1 ] && echo Yes'    # Bash does not care either way
Yes
$ bash -c '[ 1 = 1 ] && echo Yes'
Yes
$ bash -c '(( 1 == 1 )) && echo Yes'  # (( )) is a Bashism
Yes

至于"为什么引用",总结是"因为分词和全球扩展"。Wooledge维基有一篇关于它的好文章。

最新更新