我有一组带有给定后缀的文件。例如,我有一组带有后缀.pdf
的pdf文件。我想使用子字符串扩展来获取没有后缀的文件的名称。
对于我可以使用的单个文件:
file="test.pdf"
echo ${file:0 -4}
要对所有文件执行此操作,我现在尝试:
files=( $(ls *.pdf) )
ff=( "${files[@]:0: -4}" )
echo ${ff[@]}
我现在收到错误消息substring expression < 0
..
(我想避免使用for
循环)
答案 0 :(得分:5)
使用parameter expansions删除.pdf
部分,如下所示:
shopt -s nullglob
files=( *.pdf )
echo "${files[@]%.pdf}"
使用globs时shopt -s nullglob
总是一个好主意:如果没有匹配,它会使glob扩展为空。
"${files[@]%.pdf}"
将展开为已移除所有尾随.pdf
的数组。如果您希望将其放在另一个数组中,您可以这样做:
files_noext=( "${files[@]%.pdf}" )
除文件名echo
,-n.pdf
和{{1但是...... -e.pdf
只是出于演示目的。你的-E.pdf
非常糟糕! 永远不要解析echo
的输出。
回答你的评论:substring expansions对数组的每个字段都不起作用。摘自上面链接的参考手册:
files=( $(ls *.pdf) )
ls
如果
${parameter:offset}
计算的值小于零,则该值将用作${parameter:offset:length}
值末尾的偏移量。如果offset
求值为小于零的数字,并且parameter
不是length
而不是索引或关联数组,则将其解释为距{{}值末尾的偏移量1}}而不是许多字符,扩展是两个偏移之间的字符。如果parameter
为@
,则结果为parameter
位置参数从偏移量开始。 如果parameter
是由@
或length
订阅的索引数组名称,则结果是以parameter
开头的数组的@
成员。< / strong>相对于大于指定数组的最大索引的偏移量采用负偏移量。应用于关联数组的子串扩展会产生不确定的结果。
所以,例如,
*