bash中的glob模式不识别'('

nic*_*nic 4 bash glob

运行以下命令时:

rm -rf !(file1|file2)
Run Code Online (Sandbox Code Playgroud)

删除 file1和file2 之外的所有文件; 如预期.将此命令放在bash脚本中时:

#!/bin/bash
rm -rf !(file1|file2)
Run Code Online (Sandbox Code Playgroud)

或使用bash -c运行它:

bash -c "rm -rf !(file1|file2)"
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

syntax error ner unexpected token '('
Run Code Online (Sandbox Code Playgroud)

我尝试过使用设置shell选项

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

yeilding in:

bash -c "shopt -s extglob; rm -rf !(file1|file2)"
Run Code Online (Sandbox Code Playgroud)

根据以下内容启用glob:https: //superuser.com/questions/231718/remove-all-files-except-for-a-few-from-a-folder-in-unix以及其他一些问题.

它仍然不起作用,我很茫然.

rob*_*off 6

首先,为安全起见,让我们进行测试echo !(file1|file2)而不是rm -rf !(file1|file2).

无论如何,bash在执行shopt -s extglob命令之前会对整个命令行进行一些解析.当bash遇到时(,该extglob选项尚未设置.这就是你得到错误的原因.

试试这个:

bash -O extglob -c 'echo !(file1|file2)'
Run Code Online (Sandbox Code Playgroud)

在您的脚本中,您只需要在依赖它之前将该选项作为单独的命令行打开:

#!/bin/bash
shopt -s extglob
echo !(file1|file2)
Run Code Online (Sandbox Code Playgroud)

你也可以用-c旗子做到这一点:

bash -c 'shopt -s extglob
echo !(file1|file2)'
Run Code Online (Sandbox Code Playgroud)

或者甚至像这样:

bash -c $'shopt -s extglob\necho !(file1|file2)'
Run Code Online (Sandbox Code Playgroud)