Bash 參數擴展 - 在轉義連字元時獲取帶有前綴的變數
編輯: 我意識到我在這篇文章中的一個中心假設是錯誤的:
${!prefix@}
語法不能獲取函式名,只能獲取變數。因此,${!prefix@}
即使使用下劃線,也無法返回函式名。因此,我在下面的粗體問題的答案是明確的“不”。 儘管如此,下面 Edgar 的回答對於那些想要獲得基於某個前綴的函式名稱列表的人來說還是很有幫助的。原始問題
bash 參數擴展手冊為我們提供了一種方法來獲取目前環境中以某個前綴開頭的所有變數(非函式)的列表:
${!prefix@}
我有一堆函式都
foo-
以. 我嘗試過, , ,和許多其他變體。我知道連字元在參數擴展中具有其自身的含義,因此可以預期,如果沒有一些轉義等,它將無法工作。但我也希望 Bash 應該有在任何上下文中轉義特殊字元的機制,包括在參數擴展期間,除非……也許這裡不是這種情況?foo-setup``foo-run``foo-initialize``${!foo-@}``foo-``${!foo\-@}``"${!foo\-@}"``"${!foo-@}"``bar=foo; ${!${bar}-@}``-
(我已經研究過這樣一個事實,如果我想要跨平台兼容性,我應該避免使用連字元的函式名稱。我同意這一點。而且,使用連字元而不是下劃線鍵入函式要順暢得多。 ..)
因此,本著探究的精神,我提出了一個問題:**有沒有辦法使用本機參數擴展來獲取所有以連字元前綴開頭的已定義函式列表(或一般的 namerefs)?**也許解決方案是以我不知道的方式轉義連字元?
(如果沒有,是否有替代方法,也許是通過獲取變數的完整列表,然後過濾它們以僅留下具有所需連字元前綴的變數?)
有替代方法嗎?
是的,您可以使用
declare
orcompgen
獲取已定義函式的列表:解決方案 1(它將匹配包含指定字元串/模式的函式)
declare -F | grep -o 'foo-.*' #or compgen -A function | grep 'foo-'
解決方案2(特別是匹配前綴/以特定字元串/模式開頭)
declare -F | cut -d ' ' -f3 | grep '^foo-' #or compgen -A function | grep '^foo-'
關於使用參數擴展,我不確定是否可以獲取函式名稱。根據手冊,它似乎只適用於變數:
${!前綴*}
${!前綴@}
擴展為名稱以前綴開頭的變數的名稱,由 IFS 特殊變數的第一個字元分隔。當使用 ‘@’ 並且擴展出現在雙引號內時,每個變數名都會擴展為一個單獨的單詞。
還有你說的:
誠然,如果我重命名了我所有的函式,將它們的 foo- 前綴更改為 foo_,那麼 ${!foo_@} 確實得到了我所有的函式。
我想知道你是否嘗試過並且它有效(我不認為),因為我用一些功能測試過它並且沒有用。
當然,您不能使用連字元定義變數
-
,因此無法使用${prefix-@}
or${prefix-*}
。