2016-06-13 54 views
1

我想遍歷數組並收集頭中的所有值(A)。對於每個標題,應該收集這些值。用bash對數組進行迭代並收集值

myArray=('A' '0' 'A' '0' '1' '2' 'A' '0' '1' '2' '3' '4') 

for i in "${myArray[@]}"; do 
    result=$(echo "${myArray[myItem]}"|grep -c "[A-Z]"); 
    while [ "$result" -ne 0 ]; do 
     printf '%s: ' "${myArray[myItem]}" 
     myItem=$((myItem+1)) 
     result=$(echo "${myArray[myItem]}"|grep -c "[A-Z]"); 
    done 

    result=$(echo "$i"|grep -c "[0-9]"); 
    while [ "$result" -ne 0 ]; do 
     printf '%s ' "${myArray[myItem]}" 
     myItem=$((myItem+1)) 
     result=$(echo "${myArray[myItem]}"|grep -c "[0-9]"); 
    done 
    echo "" 
done 

所需的輸出:

A: 0 
A: 0 1 2 
A: 0 1 2 3 4 

不幸的是我得到:

A: 
0 
A: 
0 1 2 
A: 0 1 2 3 4 

我該怎麼辦?

二變:

#!/bin/bash 

myArray=('A' '0' 'A' '0' '1' '2' 'A' '0' '1' '2' '3' '4') 

for i in "${myArray[@]}"; do 

    result=$(echo "${myArray[myItem]}"|grep -c "[A-Z]"); 
    while [ "$result" -ne 0 ]; do 
    if [ "${myArray[myItem]}" == "A" ]; then 
     printf '%s: ' "${myArray[myItem]}" 
     myItem=$((myItem+1)) 
    else 
     break 
    fi 
    done 

    result=$(echo "$i"|grep -c "[0-9]"); 
    while [ "$result" -ne 0 ]; do 
    if [ "${myArray[myItem]}" != "A" ]; then 
     printf '%s ' "${myArray[myItem]}" 
     myItem=$((myItem+1)) 
    else 
     echo "" 
     break 
    fi 
    done 
done 

所需的輸出:

A: 0 
A: 0 1 2 
A: 0 1 2 3 4 

不幸的是我得到:

A: 0 
A: 0 1 2 
A: 0 1 2 3 4 ./myTestArray.bash: line 19: [: !=: unary operator expected 

./myTestArray.bash: line 19: [: !=: unary operator expected 

./myTestArray.bash: line 19: [: !=: unary operator expected 

./myTestArray.bash: line 19: [: !=: unary operator expected 

./myTestArray.bash: line 19: [: !=: unary operator expected 

./myTestArray.bash: line 19: [: !=: unary operator expected 

./myTestArray.bash: line 19: [: !=: unary operator expected 

我應該怎麼做才能擺脫錯誤的?

Thx提前

+1

使用[shellcheck.net](http://www.shellcheck.net/)。修復它識別的問題。然後,更新你的問題。 – John1024

+2

Thx爲您的建議約翰 – waJe

回答

1

嘗試:

myArray=('A' '0' 'A' '0' '1' '2' 'A' '0' '1' '2' '3' '4') 

fmt="%s:" 
for i in "${myArray[@]}"; do 
    case "$i" in 
     [A-Z]) 
      printf "$fmt" "$i" 
      fmt='\n%s:' 
      ;; 
     *) 
      printf " %s" "$i" 
      ;; 
    esac 
done 
echo "" 

此遍歷該陣列。對於數組中的每個元素$i,它決定它是否是大寫字符。如果是,它會在一行的開頭打印,然後是冒號。如果不是,則打印一個空格,然後顯示該元素。

這將產生輸出:

$ bash script 
A: 0 
A: 0 1 2 
A: 0 1 2 3 4 
相關問題