Bash子串扩展数组

时间:2013-11-23 09:46:38

标签: arrays bash substr expansion

我有一组带有给定后缀的文件。例如,我有一组带有后缀.pdf的pdf文件。我想使用子字符串扩展来获取没有后缀的文件的名称。

对于我可以使用的单个文件:

file="test.pdf"
echo ${file:0 -4}

要对所有文件执行此操作,我现在尝试:

files=( $(ls *.pdf) )
ff=( "${files[@]:0: -4}" )
echo ${ff[@]}

我现在收到错误消息substring expression < 0 ..

(我想避免使用for循环)

1 个答案:

答案 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>相对于大于指定数组的最大索引的偏移量采用负偏移量。应用于关联数组的子串扩展会产生不确定的结果。

所以,例如,

*