2014-02-18 25 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