如果bash中有两个不同数组的语句

时间:2016-08-21 11:32:37

标签: arrays bash shell if-statement for-loop

我有两个数组,分别是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)

2 个答案:

答案 0 :(得分:1)

这是您脚本的固定版本 - 我喜欢一些样式更改

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[@]}

答案 1 :(得分:0)

主要的错误在于这一行:

lenPT=${#arrPT}

应该写成:

lenPT=${#arrPT[@]}

但事实上,对于这样的变量,没有必要(即使使用它没有错),改变这一行:

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

为:

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

其他一些问题:

  • mod 26的价值不需要$j,它永远不会达到26。
  • 数组arrT似乎是一个索引数组:-a不需要-A
  • 如果每个结果与索引q
  • 位于同一位置,则无需变量i
  • 引用您的扩展
  • 使用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