[英]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
完成以上所有操作的腳本是:
#!/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.