Bash子串扩展数组

Håk*_*and 2 arrays bash substr expansion

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

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

file="test.pdf"
echo ${file:0 -4}
Run Code Online (Sandbox Code Playgroud)

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

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

我现在得到一个错误说substring expression < 0...

(我想避免使用for循环)

gni*_*urf 5

使用参数扩展来删除.pdf部件,如下所示:

shopt -s nullglob
files=( *.pdf )
echo "${files[@]%.pdf}"
Run Code Online (Sandbox Code Playgroud)

shopt -s nullglob使用时,水珠总是一个好主意:它将使水珠扩大到什么,如果没有匹配.

"${files[@]%.pdf}"将展开到一个.pdf删除了所有尾部的数组.你可以,如果你希望把它放在另一个数组中:

files_noext=( "${files[@]%.pdf}" )
Run Code Online (Sandbox Code Playgroud)

所有这些对于文件名(空格,换行符等)中的有趣符号都是100%安全的,除了echo命名文件的部分-n.pdf,-e.pdf以及-E.pdf...但是echo这里仅用于演示目的.你files=( $(ls *.pdf) )真的很糟糕!永远不要解析输出ls.


回答你的评论:substring expansions不适用于数组的每个字段.摘自上面链接的参考手册:

${parameter:offset}

${parameter:offset:length}

如果offset求值为小于零的数字,则该值用作距值的末尾的偏移量parameter.如果length求值为小于零的数字,并且parameter不是@索引或关联数组,则将其解释为距离值的末尾parameter而不是多个字符的偏移量,并且扩展是两个偏移量之间的字符.如果parameter@,结果是length从偏移量开始的位置参数.如果parameter@或者下标的索引数组名*,则结果是以length数组开头的数组成员${parameter[offset]}.相对于大于指定数组的最大索引的偏移量采用负偏移量.应用于关联数组的子串扩展会产生未定义的结果.

所以,例如,

$ array=( zero one two three four five six seven eight )
$ echo "${array[@]:3:2}"
three four
$
Run Code Online (Sandbox Code Playgroud)