Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2912

bash関数での再帰呼び出しサンプル(多重ループの代用)

$
0
0

はじめに

諸々の事情があり、bashで動的な多重ループ処理(←ちょっと何言ってるかわからない)を書かねばならないことに。

$ ./xxx.sh 5

なんてやったら、5回の多重ループを実施する。という要件です。

bashでそんなことできんのかよ(言語仕様的にもロジック的にも)
と思ったんですがあっさり実現できました。ので共有します。

本編

仕様

指定桁数分、すべての数値の組み合わせを求め、出力します。
具体的には

$ ./xxx.sh 3

とした場合、3桁の000~999、計1000個の数値をコンソール出力します。

コード

以下参照ください(ご使用は自己責任でお願いします)。

$ cat recursive_test.sh
#!/bin/bashSOURCE_CHARS="0123456789"LENGTH=${#SOURCE_CHARS}# 結果文字列と最大の深さ(初期値は1)result_str=""depth_max=1

# 再帰関数本体function recursive_func (){# 明示的にローカル変数を使うlocal _count=${1}local _i=0
    local _before=""for((_i=0; _i<${LENGTH}; _i++))do# 終端に1文字を連結_before=${result_str}result_str=${result_str}${SOURCE_CHARS:${_i}:1}# 深さが最大となったら結果出力# _countは0始まりなので、depth_maxから1を引いているif[${_count}-ge$((${depth_max}-1))];then
            echo${result_str}# 最大でなければ再帰呼び出しelse
            recursive_func $((${_count}+1))fi# if/elseいずれの場合も文字列は連結前に戻すresult_str=${_before}done}# パラメータで深さを受け取るif[${#}-ge 1 ];then
    if[${1}-ge 1 ];then
        depth_max=${1}fi
fi# 再帰呼び出し開始
recursive_func 0

実行結果

$ ./recursive_test.sh
0
(略)
9
$ ./recursive_test.sh 2
00
(略)
99
$ ./recursive_test.sh 3
000
(略)
999
$ ./recursive_test.sh 3 | wc-l
1000

技術?ポイント

  • 関数が書ける
  • その関数でローカル変数が使える

言語仕様的にこれらを満たすため、再帰呼び出しも可能なのでした。

ロジック的にはやや苦戦しましたが何とかなった

おわりに

感想

bashもやればできる!笑

確認環境

  • Ubuntu 18.04 LTS

Viewing all articles
Browse latest Browse all 2912

Trending Articles