我正在尝试解决在 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维基有一篇关于它的好文章。