簡體   English   中英

如何使用變量在bash中索引$ {array [*]}?

[英]How to use a variable to index ${array[*]} in bash?

首先抱歉,因為我的英語可能不好。 我想使用變量來索引數組中的元素,或者使用相同的變量來索引所有元素。 例如:

...
var1="1"
var2="*"
array=(one two three for five)

for elem in ${array[$var1]}
do
  echo $elem
done

當我在$ {array [$ var1]}中使用var1進行索引時,它可以正常工作,但如果我使用var2無法正常工作,我會收到此錯誤:

./ed.sh line XXX *: syntax error: operand expected (error token is "*")

我很確定錯誤與*通配符擴展有關,但我沒有找到幫助我解決這個問題的答案。 那么,我該怎么做呢?

*@不被視為數組中的常規元素。 迭代鍵時不會列出它們,並且在通過索引變量間接擴展時不會考慮它們。

bash 源代碼有一個函數chk_atstar ,用於檢查是否正在使用[@][*] ,你可以看到它是按字面意思完成的,而不是通過任何擴展:

else if (valid_array_reference (name, 0))
  {
    temp1 = mbschr (name, '[');
    if (temp1 && temp1[1] == '@' && temp1[2] == ']')
      {

如果你真的想這樣做,你可以通過變量間接:

arr=(one two three)
index='*'
var="arr[$index]"
echo "${!var}"

雖然你可能最好不要試圖將這些特殊的數組訪問模式視為數組元素。

我不建議這樣做,但為了完整起見,您可以通過使用eval欺騙擴展訂單來實現此目的:

eval items=\${array[$var2]}
for elem in $items
do
    echo $elem
done

這有問題。 eval通常發音為“evil”,因為從變量運行代碼可能會產生安全隱患。 通常有一種比使用eval更好的方法。 在這種情況下,您應該考慮一下設計。

如果元素包含嵌入的空格,也會出現問題。 加:

array+=('at the end')

陣列聲明后,你會明白我的意思。

編輯:經過一番考慮,這是一種沒有 eval ,它支持嵌入的空格或制表符(但不支持嵌入的換行符)。 漂亮不是:

display_it() {
    if [[ $1 = '*' ]]; then
        oldIFS="$IFS"
        IFS=$'\n'
        echo "${array[*]}"
        IFS="$oldIFS"
    else
        echo "${array[$1]}"
    fi
}

var1="1"
var2="*"
array=(one two three for five)
array+=('at the end')

while read -r elem
do
  echo $elem
done < <(display_it "$var2")

顯示:

one
two
three
for
five
at the end

在循環結束時,您將看到進程替換 ,我調用函數display_it 讀取的每個項目由換行符分隔,因此在函數中交換內部字段分隔符( IFS )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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