[英]Bash substring expansion on array
我有一组带有给定后缀的文件。 例如,我有一组后缀为.pdf
的pdf文件。 我想使用子字符串扩展获取不带后缀的文件名。
对于单个文件,我可以使用:
file="test.pdf"
echo ${file:0 -4}
为了对所有文件执行此操作,我现在尝试:
files=( $(ls *.pdf) )
ff=( "${files[@]:0: -4}" )
echo ${ff[@]}
我现在收到一条错误消息,说substring expression < 0
..
(我想避免使用for
循环)
使用参数扩展来删除.pdf
部分,如下所示:
shopt -s nullglob
files=( *.pdf )
echo "${files[@]%.pdf}"
使用glob时, shopt -s nullglob
始终是一个好主意:如果没有匹配项,它将使glob扩展为零。
"${files[@]%.pdf}"
将扩展为一个数组,其中删除了所有结尾的.pdf
。 如果愿意,可以将其放在另一个数组中,如下所示:
files_noext=( "${files[@]%.pdf}" )
对于文件名中的有趣符号(空格,换行符等),所有这一切都是100%安全的,除了名为-n.pdf
, -e.pdf
和-E.pdf
文件的echo
部分...但echo
只是在这里用于演示目的。 您的files=( $(ls *.pdf) )
真的很糟糕! 永远不要解析ls
的输出 。
回答您的评论:子字符串扩展不适用于数组的每个字段。 摘自上面链接的参考手册:
${parameter:offset}
${parameter:offset:length}
如果
offset
的数值小于零,则将该值用作从parameter
的值的末尾开始的偏移量。 如果length
计算得出的数字小于零,并且parameter
不是@
并且不是索引数组或关联数组,则将其解释为距parameter
值末尾的偏移量,而不是字符数,并且扩展名是字符在两个偏移量之间。 如果parameter
为@
,则结果是从偏移量开始的length
位置参数。 如果parameter
是一个用@
或*
下标的索引数组名,则结果是数组的length
成员,其length
为${parameter[offset]}
。 相对于大于指定数组的最大索引的偏移量,取一个负偏移量。 子字符串扩展应用于关联数组会产生不确定的结果。
因此,例如
$ array=( zero one two three four five six seven eight )
$ echo "${array[@]:3:2}"
three four
$
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.