如何解释引用的通配符

如何解释引用的通配符

我正在编写一个 shell 脚本,我需要解释引用的通配符。

"R Programming*"

我不希望*从字面上理解星号。我希望它被解释为通配符。

"R Programming"*

sed我可以使用命令将第一个转换为第二个吗?我希望它可以与任何字符串一起使用。

答案1

如果您的意思是您有一个包含的 shell 变量R programming*,并且您希望它扩展到R programming当前工作目录中以 in 开头的文件名,那么zsh您可以使用$~string请求将扩展视为模式并执行通配符结果:

string="R programming*"
print -rC1 -- $~string

(或者print -rC1 -- $~string(N)如果没有匹配的文件,则不会得到任何输出而不是错误)。

Inbash和所有其他类似 Bourne 的 shell 通配符默认情况下是在未加引号的参数扩展 (!) 以及分词时完成的。这里,由于空格字符是$IFS用于执行后者的默认值,因此在执行通配符之前将导致R programming*被拆分为R和。programming*您可以更改 的值$IFS来避免这种情况:

string="R programming*"
IFS=
shopt -s failglob
printf '%s\n' $string

或者如果没有匹配的文件则没有输出:

string="R programming*"
println() {
  [ "$#" -eq 0 ] || printf '%s\n' "$@"
}
shopt -u failglob
shopt -s nullglob
IFS=
println $string

在 POSIX sh 中,

string="R programming*"
IFS=
printf '%s\n' $string

需要注意的是,如果没有匹配的文件,您将得到R programming*作为输出(就像有一个从R programming*字面上称为的单个文件一样,这是从 Bourne shell 继承的错误功能,并且没有与bashsfailglob或等价的标准nullglob

相关内容