【问题标题】:Error "syntax error near unexpected token '('" in Bash script when selecting files选择文件时在 Bash 脚本中出现错误“意外标记 '('附近的语法错误”
【发布时间】:2018-04-28 11:54:46
【问题描述】:

运行这个脚本,bash ./cleanup.bash,

#!/bin/bash
## Going to directory-moving stuff
rm -rf !(composer.json|.git)

给出错误:

cleanup.bash:第 10 行:意外标记 '(' 附近的语法错误 cleanup.bash:第 10 行:'rm -rf !(composer.json|.git)'

但是如果我直接在终端中运行,就没有任何问题:

rm -rf !(composer.json|.git)

我尝试删除所有其他行,但我仍然收到错误。

如何在 Bash 脚本中正确输入?

我在 Ubuntu 上,这一切都是在本地完成的,而不是在远程完成的。

【问题讨论】:

  • 也检查前几行
  • 不,即使它是文件中的唯一行。它给出了这个错误。
  • 尝试在rm 命令之前执行set -o posix 或set +o posix。
  • @Inian 给出了一个新错误line 9: set: -s: invalid option
  • @janw:我的意思是shopt -s extglob

标签: linux bash terminal


【解决方案1】:

我猜你的问题是由于从脚本运行时未设置 shell 扩展 glob 选项。当您声称它在命令行中工作时,您以某种方式设置了extglob 标志,允许!() glob。

由于 Bash 脚本无论何时以 #!/bin/bash 启动,都会启动一个新的子 shell,因此在父 shell 中设置的扩展选项可能不会反映在新 shell 中。要使其生效,请在脚本中设置shebang之后:

#!/bin/bash

shopt -s extglob

## Going to directory-moving stuff
rm -rf !(composer.json|.git)

【讨论】:

  • 是的,就是这样:)
  • 在脚本的任何“范围”之外运行它很重要(例如 for 循环、if 块等)。如果您仅在“if”块内运行 shopt -s extglob,则它不会在那里生效。按照这个答案的说法,在 she-bang 之后运行它可以避免这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2016-09-06
  • 2015-06-08
相关资源
最近更新 更多