我有一个简单的脚本:庆典基名语法错误在循环
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