我正在编写一个 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 继承的错误功能,并且没有与bash
sfailglob
或等价的标准nullglob
。