提问人:cooleck 提问时间:10/10/2022 最后编辑:aynbercooleck 更新时间:10/13/2022 访问量:154
命令替换表达式中的括号
Parentheses inside command substitution expression
问:
我需要在我的 bash 脚本中获取具有 .jpg 或 .png 扩展名的文件名数组。为此,我编写了以下命令:
imagesArray=( $(ls (*.png|*.jpg)) )
它应该使用参数执行命令,该参数定义要输出的命令集,然后将命令替换在额外的括号中以制作输出数组。ls
(*.png|*.jpg)
ls
ls
ls
不幸的是,我收到一个错误:据我所知,问题出在命令替换括号内的表达式括号中。command substitution: line 5: syntax error near unexpected token `('
(*.png|*.jpg)
请帮我解决这个问题
答:
2赞
Barmar
10/10/2022
#1
你不需要使用 ,也不应该。请参阅为什么不解析 ls?ls
只需将通配符直接放入数组中即可:
set -o nullglob
imagesArray=(*.png *.jpg)
设置该选项意味着如果没有匹配项,通配符将扩展为空值,而不是扩展到通配符本身。nullglob
评论
0赞
cooleck
10/10/2022
谢谢你的回答。你能澄清一下这样的表达名称是什么吗?这也是命令替换吗?我的意思是表达。(*.png *.jpg)
0赞
Barmar
10/10/2022
它只是一个普通的通配符,就像括号中 make a 数组一样,就像你的问题一样。ls *.png
0赞
cooleck
10/10/2022
还行。但是,如果我仍然需要在命令替换中使用括号,我该怎么办?
0赞
Barmar
10/10/2022
使用它们的方式与在命令替换外部使用它们的方式相同。您遇到的问题是,在任何地方都不是有效的语法。我怀疑你的意思是(这需要启用扩展通配)或(*.jpg|*.png)
*.*(jpg|png)
*.{jpg,png}
0赞
cooleck
10/10/2022
但是,如果它是在命令行而不是在 bash 脚本文件中执行的,为什么会起作用呢?ls (*.jpg|*.png)
下一个:运行脚本时命令开头的语法错误
评论
(*.png|*.jpg)
在 bash 中不是有效的 glob 模式。因此,将 视为管道运算符,这会导致您看到的错误消息。请参见 bash 手册页中标题为“路径名扩展”的部分,了解允许的模式的定义。|