Bash

Bash中的單引號問題

  • November 9, 2022

我有一個用於初始化 dzen2 的 sh 腳本,我想使用 Source Code Pro 字型在那裡使用。這是程式碼…

param="-p -dock -fn 'Source Code Pro-10'"

# the generated_output function is not important
generated_output | dzen2 $param

問題是,腳本不起作用!dzen2沒有啟動…經過一番搜尋,我發現問題可能是因為我不太了解的單引號'或雙引號的一些問題……"

我試過用這個:

param=$'-p -dock -fn \'Source Code Pro-10\''
# or something like this
param='-p -dock -fn '"'"'Source Code Pro-10'"'"

仍然不起作用…

這個腳本有什麼問題?

如果您想跟踪幾個單獨的字元串(參數)並稍後將它們用作單獨的字元串,請不要將它們儲存在同一個字元串中。改用數組:

param=(-p -dock -fn 'Source Code Pro-10')
generated_output | dzen2 "${param[@]}"

帶引號的展開"${param[@]}"將展開為數組中的字元串列表param。請注意,這意味著這Source Code Pro-10將是一個參數,這就是您想要的。如果您忘記了副檔名周圍的引號,shell 將繼續將每個字元串拆分為$IFS字元(預設情況下為空格、製表符和換行符),然後將文件名萬用字元應用於每個生成的單詞。

您的程式碼依賴於 shell 將字元串拆分-p -dock -fn 'Source Code Pro-10'為命令的參數。由於預設情況下 shell 在空格、製表符和換行符上拆分,這將導致子字元串'Source Code Pro-10'變成單獨的參數'Source, Code, 和Pro-10'(請注意,單引號也包含在字元串中)。

有關的:


sh腳本中,您將改為使用位置參數列表:

set -- -p -dock -fn 'Source Code Pro-10'
generated_output | dzen2 "$@"

這也可以在bashshell 中工作。

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