在字符串变量中展开通配符

时间:2017-07-05 09:10:17

标签: bash wildcard expansion

我从黑名单文件中读取字符串,其中包含应删除的文件和文件夹。它适用于简单的文件名,但不适用于通配符。

E.g。如果我在shell rm -rf !(abc|def)上键入,它会删除除这两个文件之外的所有文件。将此字符串!(abc|def)放入黑名单时,它不起作用,因为字符串不会被评估。

所以我尝试使用eval,但它没有按预期工作。

#!/bin/bash
# test pattern (normally read from blacklist file)
LINE="!(abc|def)"

# output string
echo "$LINE"

# try to expand this wildcards
eval "ls $LINE"

# try with subshell
( ls $LINE )

我怎样才能使这个工作?

1 个答案:

答案 0 :(得分:5)

最有可能的是,非交互式shell(例如您的脚本运行的shell)中的extglob shell选项已关闭。

你必须改变一些事情:

#!/bin/bash

# Turn on extglob shell option
shopt -s extglob

line='!(abc|def)'

echo "$line"

# Quoting suppresses glob expansion; this will not work
ls "$line"

# Unquoted: works!
ls $line

你必须

  • 启用extglob shell选项
  • 使用$line不加引号:引用会抑制glob扩展,几乎总是期望,但不是

请注意,我使用小写变量名。大写是为shell和环境变量保留的;使用小写可以减少名称冲突的可能性(参见POSIX spec,第四段)。

此外,此处不需要eval