bash脚本命令替换内括号语法错误问题求助
解决bash脚本中获取图片文件名数组的错误
问题原因
你写的imagesArray=( $(ls (*.png|*.jpg)) )有两个核心问题:
(*.png|*.jpg)是bash的扩展glob模式(extglob),默认未开启,而且shell会把括号当成语法符号解析,而非传给ls的参数,直接触发语法错误。- 用
ls配合命令替换$()赋值数组是不合理的——如果文件名包含空格、换行或特殊字符,ls的输出会被shell按空格拆分,导致数组元素混乱。
正确解决方案
方案1:基础glob匹配(最简单直接)
不需要调用ls,bash本身支持直接用glob模式赋值数组,能完美处理带空格的文件名:
imagesArray=(*.png *.jpg)
方案2:扩展glob模式(适合复杂匹配场景)
如果偏好(*.png|*.jpg)这类简洁写法,先开启extglob选项再赋值:
# 开启扩展glob功能 shopt -s extglob # 匹配所有.png或.jpg格式的文件 imagesArray=(*.@(png|jpg)) # 若后续不需要extglob,可关闭 shopt -u extglob
验证数组内容
可以用以下命令确认数组元素是否正确:
for img in "${imagesArray[@]}"; do echo "$img" done
内容的提问来源于stack exchange,提问作者cooleck
相关产品推荐
相关产品推荐

