2014-02-18 22 views
0

如果我运行下面的shell脚本 (当时即tar文件删除来源,如果它是成功的)焦油返回脚本1,而不是交互

#!/bin/bash 
tar cvf /home/acampton/vortex_data/2014-02-14/tmp-2014-02-14-test2.tar -C /home/acampton/vortex_data/2014-02-14 SIC_17_RADAR-2014-02-14_all_no_dups.csv 
if [ $? -ne 0 ]; then 
then 
echo "Deleting files - tar successful ($?) at time "`date` 
else 
echo "Not Deleting files - tar unsuccessful ($?) at time "`date` 
fi 

则返回1(=源文件被同时存档的改变)

[email protected]:~/work/spm$ ./v1.sh 
SIC_17_RADAR-2014-02-14_all_no_dups.csv 
Not Deleting files - tar unsuccessful (1) at time Tue Feb 18 10:38:16 EST 2014 

但如果我交互式运行它,它的工作原理(每一次!)

[email protected]:~/work/spm$ tar cvf /home/acampton/vortex_data/2014-02-14/tmp-2014-02-14-test2.tar -C /home/acampton/vortex_data/2014-02-14 SIC_17_RADAR-2014-02-14_all_no_dups.csv 
SIC_17_RADAR-2014-02-14_all_no_dups.csv 
[email protected]:~/work/spm$ echo $? 
0 
[email protected]:~/work/spm$ 

我可以保证源不被修改,当我运行脚本(或交互)

香港专业教育学院还使用--exclude = everything_else_but_my_file尝试,并得到同样的事情

注意不是想起来焦油。 (通常会给出“文件在我们阅读时发生了变化”,导致它试图查找自己的.tar文件)

在我的绳索末端 - 寻找tar替代品,但需要知道为什么会发生这种情况所以我可以在晚上睡觉

任何想法?

+0

(的家当后第一行)这是怎么回事与后'“'字符的脚本? –

+0

顺便说一句,这是unidiomatic明确测试'$?'零-VS-非零时状态可以避免的。最好做'if tar ...;然后回显“tar成功”;否则回显“tar failed”; fi' - 并让'if'隐式检查tar的退出状态 –

+0

抱歉,剪切并粘贴错误“ - 修正了它 – user3321283

回答

3

if条件反转。 0表示成功,非零表示失败。使用-eq而不是-ne。另外你还有一个额外的then

if [ $? -eq 0 ]; then 
echo "Deleting files - tar successful ($?) at time "`date` 
else 
echo "Not Deleting files - tar unsuccessful ($?) at time "`date` 
fi 

实际上,测试惯用的方式,如果一个命令成功是把正确的if声明。

if tar cvf /home/acampton/vortex_data/2014-02-14/tmp-2014-02-14-test2.tar -C /home/acampton/vortex_data/2014-02-14 SIC_17_RADAR-2014-02-14_all_no_dups.csv; then 
echo "Deleting files - tar successful ($?) at time $(date)" 
else 
echo "Not Deleting files - tar unsuccessful ($?) at time $(date)" 
fi 
+0

是的,对不起,额外然后不是真的有(从另一台计算机复制) – user3321283

+0

良好的皮卡,但它为什么打印(1)为$? – user3321283

+0

这也意味着$?可能来自echo中的'date'命令 – user3321283