![在 (z)sh 脚本中正确转义星号/glob](https://linux22.com/image/199646/%E5%9C%A8%20(z)sh%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%AD%A3%E7%A1%AE%E8%BD%AC%E4%B9%89%E6%98%9F%E5%8F%B7%2Fglob.png)
我有以下问题,我需要一个包含通配字符作为明文的环境变量,并且我似乎无法转义它们。使用反斜杠转义是可行的,但由于某种原因,反斜杠仍然是字符串的一部分。”
禁用 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 和源脚本之间),则不需要。