Bash

外殼命令 ‘var=‘a-p一種−pa-p’; echo $var’ 作為輸出 ‘h’,有什麼解釋嗎?

  • March 19, 2017

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]

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