Bash

定義帶引號或不帶引號的變數有什麼區別?

  • July 19, 2015

如果我用引號定義一個變數:

TEMP="~/Dropbox"

然後

ls $TEMP

行不通,而是

echo $TEMP | ls

作品。

為了得到同樣的結果,我還可以定義不帶引號的變數,比如:

TEMP=~/Dropbox

通過這樣做,我可以簡單地輸入

ls $TEMP

我對它們之間的區別感到很困惑,我想知道我應該在何時何地分別使用這兩種定義?

TEMP="~/Dropbox"

上面定義了一個變數,該變數包含一個文字波浪號,後跟一個斜杠。因為它是用引號引起來的,所以 shell 不會擴展~/到主目錄。觀察:

$ echo "quotes=~/" noquotes=~/
quotes=~/ noquotes=/home/john1024/

因此,如果您要~/表示主目錄,則~/需要在引號之外。以下作品:

TEMP=~/"Dropbox"

讓我們考慮一下如果~/在引號中會發生什麼:

TEMP="~/Dropbox"
ls $TEMP

上面的命令將查找文件,~/Dropbox這意味著在名為Dropbox的目錄中命名的文件~。由於您很可能沒有名為 的目錄~ls因此將返回錯誤消息:“沒有這樣的文件或目錄。”

此外,下面的命令並沒有按照您的想法執行:

echo $TEMP | ls

ls忽略標準輸入。裸ls命令僅列出目前目錄中的文件,無論該目錄是什麼。

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