簡體   English   中英

當設置nounset時,如何“ - @ - expand(”$ {array [@]}“)在Bash中可能為空數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM