Linux

在 (z)sh 腳本中正確轉義星號/glob

  • December 12, 2021

我有以下問題,我需要一個包含通配字元作為明文的環境變數,我似乎無法逃避它們。用反斜杠轉義是可行的,但由於某種原因,反斜杠仍然是字元串的一部分。”

禁用 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 和源腳本之間),也不需要。

引用自:https://unix.stackexchange.com/questions/681175