2013-10-25 22 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,为什么没有人做过?)。我想我应该说'感谢你的提升';我不讨厌你! –