Bash
外殼命令 ‘var=‘a-p一種−pa-p’; echo $var’ 作為輸出 ‘h’,有什麼解釋嗎?
bash 版本:
$ bash -version GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
命令:
$ var="[a-p]"; echo $var h
任何人都知道這種解釋的原因是什麼。
對於上下文,我正在使用 shell 解析配置文件並尋找模式來獲取部分名稱
[section-foo] foo=bar
在讀取文件時,例如,如果節行是
$$ a-p $$它會得到那種奇怪的行為。
h
您在執行的目錄中有一個文件名echo $var
shell 嘗試
[a-p]
用作 glob,如果有任何匹配項,它將用匹配項替換 glob。使用名為 的文件h
,它變為echo h
您可以通過引用擴展來防止這種情況,這將導致它不被視為全域。
echo "$var"
通過不使用任何引用,
echo $var
您將擴展暴露給“拆分”和“路徑名擴展”(又名“萬用字元”或“文件名生成”)。這意味著包含
[
(also*
and?
) 的字元串將按照“路徑名擴展”的規則進行擴展。在您的情況下,這意味著有一個名稱只有一個字元的文件,稱為h
.如果引用擴展,則不會執行“路徑名擴展”:
$ echo "$var" [a-p]