サブロウ丸

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

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="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文を作成できることが分かります。

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

もしくは

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


という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