2014-02-21 53 views
8

我在寫一個創建文件夾的bash腳本,並將文件複製到該文件夾​​中。它從命令行運行,但不能從我的腳本運行。這裏有什麼問題?將帶有通配符(*)的文件複製到bash腳本中的文件夾 - 爲什麼它不起作用?

#! /bin/sh 
DIR_NAME=files 

ROOT=.. 
FOOD_DIR=food 
FRUITS_DIR=fruits 

rm -rf $DIR_NAME 
mkdir $DIR_NAME 
chmod 755 $DIR_NAME 

cp $ROOT/$FOOD_DIR/"*" $DIR_NAME/ 

我得到:

cp: cannot stat `../food/fruits/*': No such file or directory 
+3

把引號通配符意味着你正在尋找一個名爲'文件*',而不是將其擴大到文件的列表。 –

+0

OMG ...我以前沒有用引號,但它沒有工作,但出於不同的原因。從未想過要改回它。 * pacepalm *。謝謝。 –

回答

17

你說發生一樣 - 一切除了*角色應該是雙引號:

#!/bin/sh 
dir_name=files 

root=.. 
food_dir=food 
fruits_dir=fruits 

rm -rf "$dir_name" 
mkdir "$dir_name" 
chmod 755 "$dir_name" 

cp "$root/$food_dir/"* "$dir_name/" 

此外,作爲的問題最佳做法/慣例,非環境變量名稱應該是小寫的,以避免與環境變量和建立的名稱衝突罐。

+0

你能詳細說明'環境變量'的名字是什麼嗎? – myol

+1

@myol,環境變量是存儲在進程空間中的變量,任何子進程都可以讀取它;他們命名的POSIX準則http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html給出,告知該使用或者操作系統組件設置有變量全部大寫的名字,並指定名稱與至少保留一個小寫字符供應用程序使用;因此,堅持使用至少一個小寫字符的名稱不會與修改操作系統組件行爲的變量名稱發生衝突。 –

+1

...即使對於非導出的shell變量也是如此,因爲如果您爲環境中存在的名稱分配一個shell變量,那麼具有該名稱的環境變量也將被更新,從而可以覆蓋錯誤的環境變量。 (由於這一點的影響,在更新'PATH'時實際上不需要使用'export';只要它已經在環境中就會接收更新)。 –

相關問題