![带有通配符和括号的 ls 在控制台中有效,但在脚本中无效](https://linux22.com/image/1188991/%E5%B8%A6%E6%9C%89%E9%80%9A%E9%85%8D%E7%AC%A6%E5%92%8C%E6%8B%AC%E5%8F%B7%E7%9A%84%20ls%20%E5%9C%A8%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%B8%AD%E6%9C%89%E6%95%88%EF%BC%8C%E4%BD%86%E5%9C%A8%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%97%A0%E6%95%88.png)
命令:
ls /etc/pve/lxc/*([0-9]).conf
在控制台中工作:
- 结果:找到文件!
/etc/pve/lxc/107.conf
但不是在脚本中:
- /bin/bash #!/bin/bash
- 结果:错误
syntax error near unexpected token `('
ls /etc/pve/lxc/*([0-9]).conf
然后我掩盖了脚本中的括号:
ls /etc/pve/lxc/*\([0-9]\).conf
- 结果:未找到文件
ls: cannot access '/etc/pve/lxc/*([0-9]).conf': No such file or directory
答案1
表达式*([0-9]).conf
是 KSH 样式扩展的 glob。此功能默认在交互式 bash shell 中启用,但要在 bash 脚本中使用它,必须使用以下方式明确启用
shopt -s extglob
答案2
您未提供的信息是脚本中使用了哪个命令解释器。这由 shebang(即第一行)指示(例如#/bin/sh
)。
在 Ubuntu 中,控制台默认运行 bash 作为交互式 shell。如果您的脚本使用其他命令解释器(例如 /bin/sh),则特定于 bash 的语法将不起作用。