2017-03-09 91 views
0

我在处理备份的bash脚本上发现错误:每日,每月,每年。下面是该脚本:备份bash脚本错误:意外标记`新行'附近的语法错误

#!/bin/bash 

echo > /home/alpha/folder/keep.txt 
#writing dates of the backups that should be kept to the array 

for i in {0..7}; do ((keep[$(date +%Y%m%d -d "-$i day")]++)); done 
for i in {0..4}; do ((keep[$(date +%Y%m%d -d "sunday-$((i+1)) week")]++)); done 
for i in {0..12}; do 
     DW=$(($(date +%-W)-$(date -d $(date -d "$(date +%Y-%m-15) -$i month" +%Y-%m-01) +%-W))) 
     for ((AY=$(date -d "$(date +%Y-%m-15) -$i month" +%Y); AY < $(date +%Y); AY++)); do 
     ((DW+=$(date -d $AY-12-31 +%W))) 
     done 
     ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++)) 
done 
for i in {0..30}; do 
     DW=$(date +%-W) 
     for ((AY=$(($(date +%Y)-i)); AY < $(date +%Y); AY++)); do 
     ((DW+=$(date -d $AY-12-31 +%W))) 
     done 
     ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++)) 
     done 

#writing the array to file keep.txt line by line 
for i in ${!keep[@]}; do echo $i >> /home/alpha/folder/keep.txt; done 

#delete all files that not mentioned in keep.txt 
cd /home/alpha/folder 
ls -1 /home/alpha/folder/ | sort /home/alpha/folder/keep.txt /home/alpha/folder/keep.txt - | uniq -u | xargs rm -rf 
rm /home/alpha/folder/keep.txt 

当我尝试运行脚本,将引发错误消息:

./back.sh: line 12: syntax error near unexpected token `newline' ./back.sh: line 12: ` done' 

在哪里我做错了的脚本?

+0

你能否详细说明一下有用的链接吧。 –

+0

对不起,这是我测试脚本时发生的一个错误,我删除了注释 – Aserre

+1

一堆涉及不双引用变量的问题,将您的脚本复制粘贴到http://www.shellcheck.net/并亲自查看 – Inian

回答

1

您的date表达式似乎在算术上下文中行为不当。添加临时变量解决您的问题对我来说:

#!/bin/bash 

echo > /home/alpha/folder/keep.txt 
#writing dates of the backups that should be kept to the array 

for i in {0..7}; do ((keep[$(date +%Y%m%d -d "-$i day")]++)); done 
for i in {0..4}; do ((keep[$(date +%Y%m%d -d "sunday-$((i+1)) week")]++)); done 
for i in {0..12}; do 
     DW=$(($(date +%-W)-$(date -d $(date -d "$(date +%Y-%m-15) -$i month" +%Y-%m-01) +%-W))) 
     begin=$(date -d "$(date +%Y-%m-15) -$i month" +%Y) 
     for ((AY=begin; AY < $(date +%Y); AY++)); do 
     ((DW+=$(date -d $AY-12-31 +%W))) 
     done 
     ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++)) 
done 
for i in {0..30}; do 
     DW=$(date +%-W) 
     begin=$(($(date +%Y)-i)) 
     for ((AY=begin; AY < $(date +%Y); AY++)); do 
     ((DW+=$(date -d $AY-12-31 +%W))) 
     done 
     ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++)) 
     done 

#writing the array to file keep.txt line by line 
for i in ${!keep[@]}; do echo $i >> /home/alpha/folder/keep.txt; done 

#delete all files that not mentioned in keep.txt 
cd /home/alpha/folder 
ls -1 /home/alpha/folder/ | sort /home/alpha/folder/keep.txt /home/alpha/folder/keep.txt - | uniq -u | xargs rm -rf 
rm /home/alpha/folder/keep.txt 

但是,我不确定为什么表达式在算术块内部行为不当。

+0

数组扩展应该用双引号,'为我在“$ {!keep [@]}”' – Inian

+0

@Inian我知道这是最佳实践,但这不会影响OP的问题。对于这个答案,我只是复制/粘贴了OP的代码以及我的建议。他可以参考你在评论中发布的shellcheck链接来进一步改进他的代码。请注意,由于数组中存储的值是时间戳,引用很可能不会对结果产生任何影响。 – Aserre

相关问题