Linux
在 (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: \*
任何幫助,將不勝感激。
在第一種情況下,您將字元串分配給
*
變數,並且由於globsubst
已啟用,未加引號的擴展$test
受萬用字元的影響(如在 POSIX shell 中)。在第二種情況下,您分配 string\*
,但由於反斜杠轉義了星號,因此它沒有擴展為 glob。(否則 zsh 會抱怨找不到匹配的文件,除非你也禁用了它。你可能沒有以反斜杠開頭的文件名,但匹配它們的 glob 必須是\\*
.)要停止通配,請引用變數擴展,即
echo "$test"
.請參閱:何時需要雙引號?
此外,
export
如果您只是要在同一個 shell 中使用變數(即使在主 shell 和源腳本之間),也不需要。