サブロウ丸

Sabrou-mal サブロウ丸

主にプログラミングと数学

shell または bashでのタプル型for文

Pythonでいう

for i, j in [(1, 2), (3, 4), (5, 6)]:
    print(i, j)
>>> 1 2
>>> 3 4
>>> 5 6


というタプル型のfor文をシェルスクリプトで行うのがこの記事の最終目標です。

結論から言うと下記のようにします.

a=(1 3 5)
b=(2 4 6)

for ix in ${!a[@]}
do
    echo ${a[ix]} ${b[ix]}
done
>>> 1 2
>>> 3 4
>>> 5 6

上記を理解するためにシェルの構文をいくつかピックアップしました。
(主に自分用のメモです)


${#パラメータ}

シェル変数の中身の長さを取得する

a="apple"
echo ${#a}
>>> 5

${!文字@}

文字から始まる変数名をすべてリストする

apple=4
alien=3
basil=2

echo ${!a@}
>>> alian apple

${!パラメータ}

パラメータの値を表示する

apple=4
alien=apple
echo ${alien}
>>> apple
echo ${!alien}
>>> 4



はい, そしてbashのデータ構造の配列について構文を少し。

a=(1 2 3) # 配列の生成
echo ${#a} # 配列の長さを表示
>>> 3
echo ${a[1]} # 指定したインデックスの値を表示
>>> 2
echo ${a[@]} # 配列の中身を表示
>>> 1 2 3
echo ${!a[@]} # インデックスのリストを表示
>>> 0 1 2




以上より, 配列を一つ用いると, 通常のfor文を作成できることが分かります。

a=(1 2 3)
for e in ${a[@]}
do
    echo $e
done
>>> 1
>>> 2
>>> 3

もしくは

a=(1 2 3)
for ix in ${!a[@]}
do
    echo $a[ix]
done
>>> 0
>>> 1
>>> 2


というfor文を作成できます。

では、表題のプログラムですが
上記のfor文をタプル型にするには配列を2つ用意すれば終わります。

a=(1 3 5)
b=(2 4 6)

for ix in ${!a[@]}
do
    echo ${a[ix]} ${b[ix]}
done
>>> 1 2
>>> 3 4
>>> 5 6

という, ことですね。

参考:

https://stackoverflow.com/questions/41450259/how-to-use-for-in-with-tuples http://mywiki.wooledge.org/BashFAQ/005