【问题标题】:bash syntax error for adding '(' character in bash script在 bash 脚本中添加 '(' 字符的 bash 语法错误
【发布时间】:2021-11-15 21:03:42
【问题描述】:

我在 Linux 命令行上运行以下命令

cp !(non_*).txt some_folder/

它按预期工作(即,将当前文件夹中除以“non_”开头的文件之外的所有 *.txt 文件复制到 some_folder。)

但是当将同一行添加到脚本文件并执行它时 ./script.sh

它抛出以下错误。

./script.sh: line 1: syntax error near unexpected token `('

./script.sh: line 1: ` cp !(oam_cfg*).txt kk/'

这里可以更正什么?

仅供参考:我正在尝试将当前文件夹中以“non_”开头的文件除外的所有 *.txt 文件复制到 some_folder。

【问题讨论】:

  • shopt -s extglob

标签: bash shell wildcard


【解决方案1】:

正如 Jetchisel 一小时前评论的那样,您需要打开扩展通配符。

一个例子:

$: touch foo.txt bar.txt  # create a file
$: echo +(foo*txt)        # use an extended glob, which fails on syntax
bash: syntax error near unexpected token `('
$: shopt -s extglob  # turn extended globbing *ON*
$: echo +(foo*txt)   # same command now succeeds
foo.txt
$: echo !(foo).txt   # negative works as well
bar.txt

【讨论】:

  • 感谢您的解释。但我有一个疑问。在 shell 选项中设置 extglob 标志如何使其工作?我用谷歌搜索了它。但无法获得清晰的认识。你能简要介绍一下这个 extglob 的用途吗?.. 谢谢 :)
  • !(non_*).txt 在通常的基本配置中不是有效的语法。使用shopt -s extglob 设置扩展通配符基本上会改变解析规则,所以现在这一系列字符“有意义”并且变得合法。你告诉它使用额外的符号。
猜你喜欢
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多