当直接粘贴到我的 bash 终端时,以下工作(我明确地调用 bash,bash 版本4.4.19(1)-release (x86_64-pc-linux-gnu)
:)
for filename in /home/dean/Downloads/!(*example).txt; do
echo "${filename}"
done
此命令回显文件名中没有“example”的所有 txt 文件。
但是,当我将其转换为名为 的脚本时temp.sh
,chmod +x temp.sh
并通过以下方式调用它./temp.sh
:
#!/usr/bin/env bash
for filename in /home/dean/Downloads/!(*example).txt; do
echo "${filename}"
done
我收到以下错误:
dean@dean-thinkpad-p52s:~/Downloads$ ./temp.sh
./temp.sh: line 3: syntax error near unexpected token `('
./temp.sh: line 3: `for filename in /home/dean/Downloads/!(*example).txt; do'
我无法理解这里的问题。为什么它在 shell 中执行我想要的操作,但在脚本中却没有。
编辑(回答panki的问题):
env
在 shell/终端env
中调用的时间和在 shell/脚本中调用的时间之间的区别:
dean@dean-thinkpad-p52s:~/Downloads$ diff example_myshell.txt example_called_script.txt
5a6
> _=/usr/bin/env
36,37d36
< TERM=xterm-256color
< SHELL=/bin/bash
38a38,39
> SHELL=/bin/bash
> TERM=xterm-256color
45c46
< PYENV_SHELL=bash
---
> SHLVL=4
47c48
< SHLVL=3
---
> PYENV_SHELL=bash
61d61
< _=/usr/bin/env
!(...)
Korn shell 扩展运算符仅在bash
您打开该选项时可用extglob
(默认为关闭)。您可能已经
extglob
在交互式 shell 中打开了 via~/.bashrc
或其他初始化文件,但请注意,在运行脚本时这些文件不是源文件,并且该选项不是从调用 shell 继承的(除非BASHOPTS
环境中的变量,但它会是把它放在那里是个坏主意)。显式打开它
在脚本的开头应该可以工作。
请注意,
shopt -s extglob
唯一的效果从尚未解析的下一行开始。这意味着您不能使用shopt -s extglob
likeset -f
,仅在子外壳中打开扩展模式:您必须执行以下操作: