[英]How to “-@-expand (”${array[@]}") possibly empty array in Bash when nounset is set?
我有set -o nounset
選項的bash腳本(我想要那個!)。 現在,我想構造一個命令調用,但我事先並不知道參數的數量,所以我想使用一個數組(下面的例子)。 但是,當ARRAY
為空數組時, "${ARRAY[@]}"
失敗。
問題:如何@ -expand數組( "${ARRAY[@]}"
)以便在set -o nounset
時擴展不會失敗?
例:
# Clone git repo. Use --reference if ${reference_local_repo} exist.
reference_local_repo=.....
test -d "${reference_local_repo}" \
&& reference=("--reference" "${reference_local_repo}") \
|| reference=()
git clone "${reference[@]}" http://address/of/the/repo
當然,我可以使用以下代碼:
# bad example
reference=''
test -d "${reference_local_repo}" && reference="--reference ${reference_local_repo}"
...但如果本地存儲庫的路徑包含空格,則無法工作。
作為一種解決方法 ,我使用reference=("-c" "dummy.dummy=dummy")
代替reference=()
reference=("-c" "dummy.dummy=dummy")
。 這樣我就避免了空數組,而Bash也沒有抱怨。 或者,我可以(重命名數組變量和)將“clone”作為第一個數組元素。 所以我得到了這個,但我想學習正確的方法。
為了記錄,我使用的是GNU bash, version 4.3.42(1)-release (x86_64-pc-linux-gnu)
。
我不明白為什么你在這里使用數組。 你可以:
test -d "${reference_local_repo}" \
&& reference="${reference_local_repo}" \
|| reference=""
git clone ${reference:+--reference "$reference"} http://address/of/the/repo
現在沒有未定義的變量,並且對於實際上是單個值的數組沒有任何問題。
回答你的具體問題:解決這個問題的一個非常古老而簡單的方法是:
${reference[@]+"${reference[@]}"}
如果未設置引用,則不會擴展任何內容。
如果已設置,則會擴展其所有組件。
大約20年左右之前,如果沒有參數,Bourne Shell的一些破壞的小變體用“$ @”代替空字符串“”
當然,在這個特定情況下:
test -d "${reference_local_repo}" && abool="" || unset abool
git clone ${abool+--reference "$reference_local_repo"} http://address/of/the/repo
當abool
設置為NUL(“”)(或者如果您選擇使用其他值時),它會被設置,並且在下一行中它會擴展到加號之后的內容(是的,正好是兩個參數)。
當abool
未設置時,它會在下一行擴展中完全消失。
也許這更詳細:
unset abool
if test -d "${reference_local_repo}"; then abool="ValidDir"; fi
git clone ${abool+--reference "$reference_local_repo"} http://address/of/the/repo
您可以使用輔助變量(或只是重新定義相同的變量)來檢查數組是否有任何內容:
foo=${your_array[@]:-}
然后:
git clone ... "${foo}" ...
這與nounset
標志兼容。 :-
如果$your_array
未定義,變量末尾的擴展( ${your_array[@]:-}
)將產生一個空字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.