2013-07-10 36 views
0

我必須檢查文件dir1dir2的存在。然後,遞歸地刪除它們,否則打印一些消息。這裏是我的代碼:爲什麼這個bash腳本給我一個關於「缺少`]'」的錯誤?

if [ -d "dir1"] && [-d "dir2"]; then 
echo "directory exists" 
echo "deleting existing files...." 
sleep 2 
rm -r dir1 
rn -r dir1 
echo "exisitng files deleted!!" 
else 
echo "directory does not exist" 
fi 

這給我一個錯誤,說缺少的表達式。

./check.sh: line 16: [: missing `]' 
directory does not exist. 

這裏有什麼問題?

+0

你能解決這個問題嗎,@mahesh? – fedorqui

+0

是的,我解決了它,我正在運行一些不同的路徑。 – mahesh

回答

7

此行是不正確寫入:

if [ -d "dir1"] && [-d "dir2"]; then 
      ^ ^ ^
       missing spaces 

應該

if [ -d "dir1" ] && [ -d "dir2" ]; then 

然後你有這樣的:

rn -r dir1 
^ 
rn does not exist 

這應該是rmdir2因爲...你已經刪除dir1

rm -r dir2 
+0

OP也嘗試刪除dir1兩次。 – falsetru

+0

謝謝@falsetru,沒有注意到這一點。實際上他使用的是'rn'而不是'rm'。 – fedorqui

3

你需要有:

[ -d "dir" ] 

[-d "dir"] 

注意的空間。請參閱fedorqui關於其他問題的答案。

建議更強大的解決方案(更詳細的輸出添加到您喜歡):

#!/bin/sh 

dirs="dir1 dir2" # Directory names may not contain spaces 
for dir in $dirs; do 
    [ ! -d $dir ] || rm -r $dir || echo "failed to remove $dir" 
done 

注意與&&您的解決方案需要兩個目錄存在它觸發去除。我不知道這是否是你的意圖。我的解決方案查看是否存在dirs變量中的任何目錄,並且在這種情況下嘗試刪除它們。

+0

y ....得到它的工作!!是的我的意圖是,只有當兩個文件存在然後刪除文件。感謝您提出的解決方案。 – mahesh

+1

不推薦使用'dirs',因爲只有兩個目錄名都不包含空格,它才能正常工作。如果它不需要POSIX兼容,你可以在$ {dirs [@]}中使用dirs =(「dir1」「dir2」)'和'for dir; do'。 – chepner

+0

@chepner:是的,你說得對,好點。但是我認爲這個用例很簡單,可以工作。在查看其他答案(甚至是問題)時,也沒有引用「rm」,如果目錄名稱包含空格,那麼調用很可能也會失敗(最佳做法:*不要*在文件/目錄名稱)。不過,我會添加一條關於它的評論,謝謝。 – Jite

相關問題