簡體   English   中英

bash中兩個不同數組的if語句

[英]If statement for two different arrays in bash

我有兩個數組,分別是arrAlpha []和arrPT []。 數組arrAlpha包含字母,數組arrPT []包含一些普通字母。以下是我在bash shell腳本中編寫的代碼,用於比較兩個數組的元素並將arrPT []的位置元素存儲在arrAlpha []中以進行數組arrT []。 但是,當我運行時,我覺得if語句在arrT []中打印出元素時出現了問題。 有人可以幫我嗎?

     #!/bin/bash

     arrAlpha=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)

     arrPT=(E K N R S W )
     lenPT=${#arrPT}
     declare -A arrT
     q=0
     for((i=0; i<lenPT; i++)) do
         for((j=i; j<26; j++)) do
             if [  ${arrPT[$i]}  =  ${arrAlpha[$j]}  ]; then
                 arrT[$q]=$j % 26;
                 ((++q));
             fi
          done
     done

     echo ${arrAlpha[@]}
     echo ${arrPT[@]}
     echo ${arrT[@]}

預期的輸出是將arrPT元素更改為數字0到25。

    arrAlpha=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)
    arrPT =(E K N R S W)
    arrT =(4 10 13 17 18 22)

這是腳本的固定版本-我希望進行一些樣式更改

arrAlpha=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)
arrPT=(E K N R S W )
# array length needs index *
lenPT=${#arrPT[*]}
# seems arrT can be simple indexed array
declare -a arrT
q=0
for((i=0; i<lenPT; ++i)); do
  for((j=0; j<26; ++j)); do
    if [[ ${arrPT[i]} == ${arrAlpha[j]} ]]; then
# arithmetic inside $(())
      arrT[q++]=$((j % 26))
    fi
  done
done
echo ${arrAlpha[@]}
echo ${arrPT[@]}
echo ${arrT[@]}

此行的主要錯誤是:

lenPT=${#arrPT}

應該這樣寫:

lenPT=${#arrPT[@]}

但是,實際上,對於此類變量沒有必要(即使使用它沒有錯),也可以更改此行:

for((i=0; i<lenPT; i++)) do

至:

for((i=0; i<${#arrPT[@]}; i++)) do

其他一些問題:

  • 不需要將$j的值修改為mod 26 ,它將永遠不會達到26。
  • 數組arrT似乎是一個索引數組: -a不需要-A
  • 如果每個結果與索引i位置相同,則不需要變量q
  • 引用您的擴展
  • 使用printf(更可靠)代替echo。

完成以上所有操作的腳本是:

#!/bin/bash

 arrAlpha=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)
 arrPT=(E K N R S W )

 declare -a arrT

 for((i=0; i<${#arrPT[@]}; i++)) do
    for((j=i; j<${#arrAlpha[@]}; j++)) do
       [[  ${arrPT[i]}  ==  "${arrAlpha[j]}"  ]] && let arrT[i]=j
    done
 done

 printf '%s ' "${arrAlpha[@]}"  ; echo 
 printf '%3s ' "${arrPT[@]}"    ; echo 
 printf '%3s ' "${arrT[@]}" ; echo

當然,可以通過在字符處剪切該字符串來刪除第二個循環:

#!/bin/bash

Alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZ
arrPT=(E K N R S W )

declare -a arrT

for((i=0; i<${#arrPT[@]}; i++)) do
    arrT[i]=${Alpha%"${arrPT[i]}"*}    # cut the string at the character.
    arrT[i]=${#arrT[i]}                # Use the len of the cut string.
done

printf '%s ' "$Alpha"           ; echo 
printf '%3s ' "${arrPT[@]}" ; echo 
printf '%3s ' "${arrT[@]}"      ; echo

暫無
暫無

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

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