bash - 扩展字符串变量中的通配符

标签 bash wildcard expansion

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

例如如果我在 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 )

我怎样才能让它工作?

最佳答案

最有可能的是,非交互式 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

关于bash - 扩展字符串变量中的通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44921784/

相关文章:

linux - Bash:if语句总是成功

bash - grep后查找字符串

java - 如何向 Java 通用通配符列表添加元素

python-3.x - 如何评估路径中的双星号(星号)?

regex - 与 shell-globbing 通配符和 Regex 的混淆

C Minishell 命令扩展打印乱码

while-loop - 如何在 zsh 中一次一个单词地遍历字符串

linux - 将命令的输出分配给变量

arrays - 从 bash 输出 bash 引用数组

batch-file - 在括号变量扩展禁用的 block 中准备字符串,以将其返回到启用扩展的调用范围(不允许调用)