在 (z)sh 脚本中正确转义星号/glob

在 (z)sh 脚本中正确转义星号/glob

我有以下问题,我需要一个包含通配字符作为明文的环境变量,并且我似乎无法转义它们。使用反斜杠转义是可行的,但由于某种原因,反斜杠仍然是字符串的一部分。”

禁用 GLOB_SUBST 可以解决该问题,但我想避免这种情况。

我使用以下方法来缩小问题范围:

touch foo; chmod +x ./foo

# glob expansion i.E. $test contains all files in the directory.
echo 'export test="*"; echo $test' > foo; source ./foo 

# no glob expansion, but the escape character is added to the string.
echo 'export test="\*"; echo $test' > foo; source ./foo  
# output: \*

任何帮助,将不胜感激。

答案1

在第一种情况下,您将字符串分配*给变量,并且由于globsubst启用了该选项,因此未加引号的扩展$test会受到通配符的影响(如在 POSIX shell 中)。在第二种情况下,您分配 string \*,但它不会扩展为 glob,因为反斜杠转义了星号。 (否则 zsh 会抱怨没有找到匹配的文件,除非你也禁用了它。你可能没有以反斜杠开头的文件名,但匹配它们的 glob 必须是\\*。)

要停止通配,请引用变量扩展,即echo "$test".

看:什么时候需要双引号?

export另外,如果您只想在同一 shell 中使用变量(甚至在主 shell 和源脚本之间),则不需要。

相关内容