2013-02-20 188 views
2

我正在嘗試編寫一個使文件的多個副本的小型shell腳本。我能夠將文件名稱作爲輸入,但不能獲得副本數量。這是我寫的。但我無法將NUMBER變量傳遞給for循環。使用shell腳本創建多個文件副本

echo -n "Enter filename: " 
read FILENAME 
echo -n "Number of copies to be made: " 
read NUMBER 
for i in {2..$NUMBER} 
do 
cp -f $FILENAME ${FILENAME%%.*}"_"$i.csv 
done 

回答

3

不幸的是,它不能這樣工作。 Bash performs brace expansion before parameter expansion,所以在對$NUMBER進行評估之前,您的支架將會展開。另請參閱Bash Pitfall #33,它解釋了這個問題。

要做到這一點,使用你的代碼的一種方式,應該是:

for i in $(eval echo {2..$NUMBER}) 
do 
# ... 
done 

或者更短:(!謝謝,格倫·傑克曼)

for i in $(seq 2 $NUMBER) 
# ... 


請注意,通常,variables should be quoted。這對於文件名是特別重要的。如果你的文件被稱爲foo bar?那麼你的cp -f將複製foobar,因爲參數被空白分隔。

所以,做這樣的事情:

cp -f "$FILENAME" "${FILENAME%%.*}_${i}.csv" 

而如果你的文件不包含空格,引用變量是你應該自動完成,以防止在未來的任何意外,可能並不重要。

+0

謝謝你。我也在爲基本概念尋找shell腳本的簡明參考。 – gthm 2013-02-20 21:38:14

+0

@gthmgeeky不幸的是(在我看來)Bash腳本沒有「基本」概念。當涉及到人們認爲相當容易的事情時,Bash是非常特殊的。查看[高級Bash腳本指南](http://tldp.org/LDP/abs/html/)和[Greg's Bash Wiki](http://mywiki.wooledge.org/)以及[Bash黑客維基](http://wiki.bash-hackers.org/)。 – slhck 2013-02-20 21:39:42

+0

如果你想刪除擴展名,不要假設文件名只有一個點:使用'$ {FILENAME%。*}'而不是'$ {FILENAME %%。*}' – 2013-02-20 23:17:36