Bash basename命令未按预期工作

Bash basename命令未按预期工作,bash,shell,unix,ubuntu-12.04,rename,Bash,Shell,Unix,Ubuntu 12.04,Rename,我编写了一个shell脚本,将我的许多JPG转换为pdf #!/bin/bash set -xv for i in `ls -v *.JPG`; do i=$(basename "$i") convert "$i" "$i.pdf" ; done JPG是 DSCN2612.JPG DSCN2618.JPG DSCN2624.JPG 我得到的转换PDF都有名字 DSCN2612.JPG.pdf DSCN2618.JPG.pdf DSCN2624.JPG.pdf 现在请注意,在我的she

我编写了一个shell脚本,将我的许多JPG转换为pdf

 #!/bin/bash
set -xv
for i in `ls -v *.JPG`;
 do i=$(basename "$i")
 convert "$i" "$i.pdf" ;
 done
JPG是

DSCN2612.JPG DSCN2618.JPG DSCN2624.JPG

我得到的转换PDF都有名字

DSCN2612.JPG.pdf DSCN2618.JPG.pdf DSCN2624.JPG.pdf

现在请注意,在我的shell脚本中使用了basename命令,我希望pdf的结果名称是

DSCN2612.pdf DSCN2618.pdf DSCN2624.pdf

输出在哪里是不同的。 我正在使用Ubuntu12.04和basename——版本显示

basename(GNU coreutils)8.13版权所有(C)2011自由软件 基金会,GPRV3+:GNU GPL版本3或更高版本 . 这是自由软件:你是 可以自由更改和重新分发。对客户而言,没有任何保修 法律允许的范围

在终端上时,我只需键入

basename DSCN2612.JPG
我得到输出

DSCN2612.JPG

如我所料,在哪里

DSCN2612


只有这样,我的理解是错误的,或者我使用这个脚本的方式有一些错误

basename命令有两种用途,剥离路径前缀和(可选)剥离后缀

例如,要去除路径前缀,只需向其传递路径即可

basename /path/to/file.ext
# file.ext
basename /path/to/file.ext .ext
# file

basename DSCN2612.JPG .JPG
# DSCN2612
要额外去除后缀,您需要告诉
basename
您希望去除的后缀,例如

basename /path/to/file.ext
# file.ext
basename /path/to/file.ext .ext
# file

basename DSCN2612.JPG .JPG
# DSCN2612
因此,
basename
不会“自动检测”后缀,因为在unix中,文件不一定有后缀。换句话说,句点后的字母不一定是后缀,所以您需要明确地告诉它要去掉哪个后缀

但是,对于“自动检测”和剥离,有一些特定于bash的替代方案。比如说,

x="file.ext"
echo ${x%.*}
# file
不知道更多,我可能会把你的剧本写成

for jpg in *.JPG; do
    base=${jpg%.*}
    convert "$jpg" "$base.pdf"
done

您必须指定要删除的后缀-例如
basename DSCN2612.JPG.JPG
outputs
DSCN2612
您是对的,我做了相同的操作,但即使这样,我也无法在键入的终端上获得转换后的pdf,而输入的是
convert DSCN2602.JPG`basename$2.JPG`.pdf
,但输出是bash.pdfI添加到我的答案中的不同版本的脚本,看看这是否有帮助。我遇到了一个问题,因为我的换行符是CRLF而不是LF,所以字符串有一个尾随的回车符。为了能够使用具有文件扩展名的convert命令,我需要的是
convert somename.JPG somename.pdf
convert是imagemagick库的一部分。在这种情况下,我需要给filename.JPGRight,这就是我在最后添加的脚本应该做的。那太好了,我刚刚用你的逻辑库=$(basename“$I”.JPG)尝试了我的脚本,它工作了
${VAR%pattern}
是POSIX的标准特性,而不是
bash
扩展。