命令正在终端上运行,但在 bash 脚本中没有给出语法错误

Abd*_*oiz 0 linux bash shell ubuntu sh

下面是我放在 /usr/bin 中的脚本,因为我想让它在全球范围内可用

#!/bin/bash
cd /app/data/zips
rm -rf -i -v !(*.zip)
cd /app/cronscripts/import
> import_output.log
nohup ./import.sh > import_output.log & disown
Run Code Online (Sandbox Code Playgroud)

除了下面给定的行之外,上面脚本中的所有内容都运行良好,但是,当直接从终端运行该命令时,它运行良好。用于删除目录中除 .zip 文件外的所有文件和文件夹

rm -rf -i -v !(*.zip)
Run Code Online (Sandbox Code Playgroud)

每当我尝试运行此脚本时,它都会给我以下错误。

/usr/bin/importdata.sh: line 3: syntax error near unexpected token `('
/usr/bin/importdata.sh: line 3: `rm -rf -i -v !(*.zip)'
Run Code Online (Sandbox Code Playgroud)

我的哪个 bash 输出是:

/bin/bash
Run Code Online (Sandbox Code Playgroud)

操作系统信息:

Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:        18.04
Codename:       bionic
Run Code Online (Sandbox Code Playgroud)

小智 5

bash,!(pattern)是一个扩展的 glob 模式。打开 shell 选项,它启用:

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

shopt应该出现在脚本开头的单独一行中,以及您可能依赖的任何其他选项。见羊毛https : //mywiki.wooledge.org/glob#Options_which_change_globbing_behavior

extglob改变某些字符的解析方式。shopt -s extglob在使用它的任何后续命令之间必须有一个换行符(不仅仅是分号)。您不能启用一组命令使用它们,因为整个块之前解析内部扩展水珠shopt评估