私はbashスクリプトを学ぶのが初めてで、このコードを書く方法が混乱しています。
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
これは2つの配列で、要素の合計(23 + 12、34 + 13など)を取得する必要があります。出力は、Result 1: xx
配列内のすべての10要素の(合計)でなければなりません。 Cスタイルループを使用してこれをどのようにコーディングできますか?
答え1
別のオプションは次のとおりです。
#!/bin/bash
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
for ((i = 0; i < ${#array1[@]} && i < ${#array2[@]}; i++)); do
printf "Result %2d: %d\n" $((i + 1)) $((array1[i] + array2[i]))
done
例を実行してください:
Result 1: 35
Result 2: 47
Result 3: 37
Result 4: 55
Result 5: 53
Result 6: 55
Result 7: 44
Result 8: 23
Result 9: 22
Result 10: 43
スクリプトはゼロから始まり、最も短い配列の長さまでループで実行されます(将来の変更によって、ある配列が他の配列よりも長くなる場合に備えて)。ループを通過するたびにi番目の項目の結果を印刷します。
答え2
たぶんこんなことはありませんか?
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
# Declare array3 as an array
array3=()
for i in $( seq 1 $((${#array1[@]}+1)) ); do
array3+=( $(( ${array1[i]} + ${array2[i]} )) );
printf 'Result %d : %s\n' "$i" "${array3[i]}";
done
出力:
Result 1 : 47
Result 2 : 37
Result 3 : 55
Result 4 : 53
Result 5 : 55
Result 6 : 44
Result 7 : 23
Result 8 : 22
Result 9 : 43
答え3
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
set -- "${array1[@]}"
unset counter
for elem in "${array2[@]}"; do
set -- "$@" "$((++counter))" "$(( $1 + elem ))"
shift
done
printf 'Result %d: %d\n' "$@"
これは配列の1つ(2番目の要素)のすべての要素を繰り返し、各要素の位置引数$elem
リストにカウンタと合計を追加します。
合計は、$elem
最初の位置引数に追加し、リストから削除することによって$1
計算されます。位置パラメータはリストの最初の要素に初期化されるため、要素は効果的にペアになります。
ループ後の位置引数には、合計とペアになるカウンタ値が含まれます。それからprintf
。
出力は次のとおりです
Result 1: 35
Result 2: 47
Result 3: 37
Result 4: 55
Result 5: 53
Result 6: 55
Result 7: 44
Result 8: 23
Result 9: 22
Result 10: 43
もちろん、ループから直接結果を印刷することもできます。
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
set -- "${array1[@]}"
unset counter
for elem in "${array2[@]}"; do
printf 'Result %d: %d\n' "$((++counter))" "$(( $1 + elem ))"
shift
done
Cスタイルwhile
ループを使用してください。
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
set -- "${array1[@]}"
unset counter
while [ "$#" -ne 0 ]; do
printf 'Result %d: %d\n' "$((++counter))" "$(( $1 + array2[counter-1] ))"
shift
done
純粋なsh
変形:
set -- 23 34 23 12 11 32 12 12 12 21
unset counter
for elem in 12 13 14 43 42 23 32 11 10 22; do
printf 'Result %d: %d\n' "$((counter += 1))" "$(( $1 + elem ))"
shift
done
使用bc
とpaste
:
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
paste -d '+' \
<( printf 'print "Result ", ++c, ": ", %s\n' "${array1[@]}" ) \
<( printf '%s, "\\n"\n' "${array2[@]}" ) |
bc
使用awk
(Cスタイルfor
ループで!):
array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)
awk -v a="${array1[*]}" \
-v b="${array2[*]}" \
'
BEGIN {
split(a,aa," ");
n = split(b,bb," ");
for (i = 1; i <= n; ++i)
printf "Result %d: %d\n", i, aa[i]+bb[i]
}'
答え4
DCの楽しみのために
申し訳ありません。レビューはフランス語です。
#!/bin/bash
array1=(23 34 23 12 3211 32 12 2 12 21)
array2=(12 13 14 43 42 23 32 5 710 22)
dc <<EOF
# Definition
# macro e = quitter si les tableaux n ont pas la meme taille
# macro f = calcul du nb de digit du resultat et stocke le max dans registre p
# macro g = addition des tableaux dans le registre tableau m
# macro h = afficher les espaces pour le formattage
# macro i = affichage du resultat formatte
# registre j = nb elt tableau
# registre k = nb max de digit de l index du tableau
# registre l = compteur elt tableau
# registre m = tableau indexe de la somme des tableaux d entree
# registre n = compteur du nb de digit de l index du tableau
# registre o = nb max de digit pour affichage
# registre p = nb max de digit du calcul
# registre q = poubelle
# Strings
[arrays are not the same size]sa
[Result]sb
[:]sc
[ ]sd
# Macros
[lapq]se
[dZsp]sf
[ll;m+dZlp<fll:mll1-dsl0<g]sg
[lnd1+snldnlo>h]sh
[ll1+dddsllbndZsnlksolhxnlcn;mdZsnlpsolhxpsqlj>i]si
# Program
$(printf "%d\n" ${array1[*]})
zdsjZsk
$(printf "%d\n" ${array2[*]})
zlj-lj!=e
ljsllgxljsllgx
lix
EOF
展示する:
Result 1: 35
Result 2: 47
Result 3: 37
Result 4: 55
Result 5: 3253
Result 6: 55
Result 7: 44
Result 8: 7
Result 9: 722
Result 10: 43