繁体   English   中英

Bash子串在数组上的扩展

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM