Amarakon Asked: 2022-07-08 21:02:18 +0800 CST2022-07-08 21:02:18 +0800 CST 2022-07-08 21:02:18 +0800 CST 我如何解释带引号的通配符 772 我正在编写一个 shell 脚本,我需要解释带引号的通配符。 "R Programming*" 我不希望*星号按字面意思理解。我希望它被解释为通配符。 "R Programming"* 有没有sed可以用来将第一个转换为第二个的命令?我希望它适用于任何字符串。 shell scripting 1 个回答 Voted Best Answer Stéphane Chazelas 2022-07-08T23:22:42+08:002022-07-08T23:22:42+08:00 如果您的意思是您有一个 shell 变量,其中包含R programming*并且您希望它扩展为以当前工作目录开头的文件名R programming, in zsh,您将使用$~string请求将扩展视为一种模式并执行 globbing 作为结果: string="R programming*" print -rC1 -- $~string (或者print -rC1 -- $~string(N)如果没有匹配的文件,则没有输出而不是错误)。 Inbash和所有其他类似 Bourne 的 shell 通配符默认情况下是在不带引号的参数扩展 (!) 以及分词时完成的。$IFS在这里,由于空格字符在用于执行后者的默认值中,这将导致在执行通配符之前R programming*被拆分。您可以更改 的值以避免这种情况:Rprogramming*$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.
如果您的意思是您有一个 shell 变量,其中包含
R programming*
并且您希望它扩展为以当前工作目录开头的文件名R programming
, inzsh
,您将使用$~string
请求将扩展视为一种模式并执行 globbing 作为结果:(或者
print -rC1 -- $~string(N)
如果没有匹配的文件,则没有输出而不是错误)。In
bash
和所有其他类似 Bourne 的 shell 通配符默认情况下是在不带引号的参数扩展 (!) 以及分词时完成的。$IFS
在这里,由于空格字符在用于执行后者的默认值中,这将导致在执行通配符之前R programming*
被拆分。您可以更改 的值以避免这种情况:R
programming*
$IFS
或者如果没有匹配的文件,则没有输出:
在 POSIX sh 中,
需要注意的是,如果没有匹配的文件,您将得到
R programming*
输出(就好像有一个R programming*
从字面上调用的单个文件一样,从 Bourne shell 继承的错误功能,并且没有等效于bash
'sfailglob
或nullglob
.