2012-01-11 39 views
1

嗨我有很多目錄,其名稱中有空格。我有一些腳本可以在它們上運行。 下面是一個示例腳本目錄名稱中的空格導致錯誤

#!/bin/bash 
docid='/home/deel/PDF/rant/spr 2008 Shree rose Visheshank' 
p=1 
while [ $p -lt 117 ]; do 
cp $docid/$p.pdf ./ 
p=$p+1 
done 

在執行上面的腳本我收到以下錯誤

cp: cannot stat `/home/deel/PDF/rant/spr': No such file or directory 
cp: cannot stat `2008': No such file or directory 
cp: cannot stat `Shree': No such file or directory 
cp: cannot stat `rose': No such file or directory 
cp: cannot stat `Visheshank/1.pdf': No such file or directory 
./d2.sh: line 5: [: 1+1: integer expression expected 

我已經使用了雙引號「」嘗試,但結果是一樣的。 我應該做什麼改變?

回答

4

這條線:

cp $docid/$p.pdf ./ 

應改爲:

cp "$docid/$p.pdf" ./ 

例子:

$ a='abc def' 
$ ls $a 
ls: abc: No such file or directory 
ls: def: No such file or directory 
$ ls "$a" 
ls: abc def: No such file or directory 

和算術是這樣:

p=$[p+1] 

示例:

$ p=1 
$ q=$[p+1] 
$ echo $p $q 
1 2 
+0

謝謝你使這個清楚。究竟是什麼原因,它是以你解釋的方式工作? – 2012-01-11 12:09:09

+0

p = $ [p + 1]是bashism。你可以用$((p + = 1))更便攜地進行算術運算,甚至可以更便攜地使用eval。 (「更便攜」意味着posix,「更便攜」意味着應該在70年代的炮彈中工作) – 2012-01-11 13:21:39

+0

@RegisteredUser:'$ a'擴展爲'abc def',所以'ls $ a'擴展爲'ls abc def ',即2個參數。 'ls「$ a」'展開爲'ls「abc def」',即1個參數。 – mvds 2012-01-11 13:34:23

2

您需要引用包含帶雙引號的空格的名稱。而且,p=$p+1不符合你的期望。這裏是正確的循環:

for p in `seq 116`; do 
    cp "$docid/$p.pdf" ./ 
done 
+0

感謝您的seq提示。 – 2012-01-11 12:08:45

+1

'{1..116}'可以代替'seq'命令或可能''seq -f「%03g」116'(請注意,您可能會希望早晚對它們進行排序)。 – potong 2012-01-11 12:19:12

+1

@potong:我知道這個問題被標記爲'bash',但我通常更喜歡記住POSIX兼容的變體而不是特定於bash的擴展。 'seq -f「%03g」116'更容易寫成'seq -w 116',但這兩個都沒有多大幫助 - 操作系統顯然希望將名爲'1.pdf'的文件複製到'116.pdf '。 – 2012-01-11 12:24:35