我有一個簡單的腳本:慶典基名語法錯誤在循環
for photo in $full_path/*.jpg; do
$b_photo=$(basename $photo)
echo $b_photo
done
它簡化了什麼,我試圖做的形式,但是這給了我的錯誤是這樣的:
./foo.sh: line 334: =foobar.jpg: command not found
我有一個簡單的腳本:慶典基名語法錯誤在循環
for photo in $full_path/*.jpg; do
$b_photo=$(basename $photo)
echo $b_photo
done
它簡化了什麼,我試圖做的形式,但是這給了我的錯誤是這樣的:
./foo.sh: line 334: =foobar.jpg: command not found
指定變量與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
除了問題pointed out by fedorqui,basename $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 }
的經典和POSIX版本['basename'(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/basename.html) 沒有選擇,所以不應該出現的'-directory'問題。坦率地說,帶有選項的命令被破壞了。 Mac OS X上的'basename'具有選項'-a'和'-s'。我不相信這是一個增強(雖然我創建以破折號開始嚴格限制文件的次數 - 說完這些,我沒有今天上午意外創建一個文件'-'同時檢查一些shell語法)。 –
@JonathanLeffler:在FreeBSD,Linux和OS X,'基本名-foo'說「基本名稱:非法選項 - F」所以,如果你關心移植到任何這些操作系統,這是一個真正的問題! –
是的;我不否認這是一個問題。我只是很煩惱找到一個不必要的可移植性問題。如果我們不小心,他們會修正'tr',因此需要文件名參數(... errr,爲什麼沒有人做過?)。我想我應該說'感謝你的提升';我不討厭你! –
Simplified:使用美元符號'$ var'獲取值,用'var ='賦值。 – Jite
「echo」$(basename $ photo)「''的所有轟炸聲是什麼?寫:'basename $ photo',它將名稱寫入標準輸出。 :d –
@JonathanLeffler +1的評論,因爲它提醒了我,我學會了如何在[誇誇其談字(http://www.youtube.com/watch?v=DPLwSaUpZC4),很久以前:順便說一下d謝謝,你是完全正確的。相應更新。 – fedorqui