我有两个数组,分别是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)
答案 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
完成上述所有操作的脚本是:
#!/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