2013-10-25 21 views
0

我有一個簡單的腳本:慶典基名語法錯誤在循環

for photo in $full_path/*.jpg; do 
    $b_photo=$(basename $photo) 
    echo $b_photo 
done 

它簡化了什麼,我試圖做的形式,但是這給了我的錯誤是這樣的:

./foo.sh: line 334: =foobar.jpg: command not found 

回答

5

指定變量與var=$(command)$var使用它們(或者更好,${var}):

for photo in $full_path/*.jpg; do 
    b_photo=$(basename $photo)  <------ b_photo=$() instead of $b_photo=$() 
    echo $b_photo             ^
done 

注意,你可以直接寫:

for photo in $full_path/*.jpg; do 
    basename "$photo" 
done 
+0

Simplified:使用美元符號'$ var'獲取值,用'var ='賦值。 – Jite

+2

「echo」$(basename $ photo)「''的所有轟炸聲是什麼?寫:'basename $ photo',它將名稱寫入標準輸出。 :d –

+1

@JonathanLeffler +1的評論,因爲它提醒了我,我學會了如何在[誇誇其談字(http://www.youtube.com/watch?v=DPLwSaUpZC4),很久以前:順便說一下d謝謝,你是完全正確的。相應更新。 – fedorqui

3

除了問題pointed out by fedorquibasename $photo會出問題,如果$photo包含空格:

$ photo="directory/file name" 
$ basename $photo 
file 

它也一定會出問題,如果$photo開始於-

$ photo="-directory/file" 
$ basename $photo 
basename: illegal option -- d 
usage: basename string [suffix] 
     basename [-a] [-s suffix] string [...] 

你可以寫:

for photo in "$full_path"/*.jpg; do 
    basename -- "$photo" 
done 

,但一個簡單的執行這項任務(在匹配模式到標準輸出,每行一個一個目錄打印文件名)的方法是將切換到該目錄,並使用printf

{ cd -- "$full_path" && printf "%s\n" *.jpg } 
+0

的經典和POSIX版本['basename'(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/basename.html) 沒有選擇,所以不應該出現的'-directory'問題。坦率地說,帶有選項的命令被破壞了。 Mac OS X上的'basename'具有選項'-a'和'-s'。我不相信這是一個增強(雖然我創建以破折號開始嚴格限制文件的次數 - 說完這些,我沒有今天上午意外創建一個文件'-'同時檢查一些shell語法)。 –

+0

@JonathanLeffler:在FreeBSD,Linux和OS X,'基本名-foo'說「基本名稱:非法選項 - F」所以,如果你關心移植到任何這些操作系統,這是一個真正的問題! –

+0

是的;我不否認這是一個問題。我只是很煩惱找到一個不必要的可移植性問題。如果我們不小心,他們會修正'tr',因此需要文件名參數(... errr,爲什麼沒有人做過?)。我想我應該說'感謝你的提升';我不討厭你! –