簡體   English   中英

使用嵌套 for 循環 bash

[英]Using nested for loop bash

我是第一次編寫 bash 腳本。 我必須使用nested for loop 我有一個這樣的數組:

(foo,bar a,b)

數組中有兩個元素,數組中的每個元素用逗號分隔。 我希望數組中的每個元素都拆分並打印每個元素。 我想要的最終結果是

foo
bar
a
b

我正在使用嵌套的 for 循環,如下所示,但我沒有得到任何響應

    IFS=','
    echo "class names is::${classNames[@]}" // prints foo,bar a,b
    for ((n=0;n<${#classNames[@]};n++)){
    
    classes=${classNames[n]}
    
    for ((i=0;n<${#classes[@]};i++)){
    
    echo "${eachClass[i]}"
    
    }
    }

你可以:

arr=(foo,bar a,b)
for i in "${arr[@]}"; do
   while IFS=, read -ra arr_in; do
       for j in "${arr_in[@]}"; do
           echo "$j"
       done
   done <<<"$i"
done

或喜歡:

for i in "${arr[@]}"; do
   readarray -d, -t arr_in < <(printf "%s" "$i")
   for j in "${arr_in[@]}"; do
       echo "$j"
   done
done

要不就:

while IFS=, read -ra arr_in; do
    for j in "${arr_in[@]}"; do
       echo "$j"
    done
done < <(printf "%s\n" "${arr[@]}"

甚至:

while IFS=, read -ra arr_in; do
    printf "%s\n" "${arr_in[@]}"
done < <(printf "%s\n" "${arr[@]}"

但那說:

printf "%s\n" "${arr[@]}" | tr ',' '\n'

也會打印相同的。

不要使用{ }作為循環終止符 - 它是未記錄的非常古老的 bash/shell 語法。 使用do..done

classes=...是一個普通變量,而不是一個數組,並且在這樣的賦值中IFS無關緊要 - 這里=的右側部分不是單詞拆分。 要分配數組,請使用大括號classes=(${classNames[n]})

您可以使用 IFS 拆分空格和逗號上的值:

IFS=', ' read -ra arr <<<"${arr[*]}"
for i in "${arr[@]}"; do
    echo "$i"
done

甚至喜歡:

while IFS= read -r i; do
    echo "$i"
done < <(IFS=', '; printf "%s\n" ${arr[*]})

...或像這樣

for item in "${arr[@]}"; {
    sub=(${item//,/ })
    echo "item1=${sub[0]}"
    echo "item2=${sub[1]}"
}

read

for item in "${arr[@]}"; {
    read i1 i2 <<< ${item//,/ }
    echo "item1=$i1"
    echo "item2=$i2"
}

訣竅是我們通過這個 bash 語法${item//,/ } (${var_name//pattern/replacement}) 將 ',' 切換到 ' '(空格),這稱為變量替換。 而這個<<<是用來直接從var中讀取的。

不使用明顯循環的實用單線解決方案是

(IFS=', '; printf '%s\n' ${classNames[*]})

它在子shell 中運行,以免弄亂當前shell 的IFS

暫無
暫無

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

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