【シェルスクリプト】forやwhileによる繰り返しワンライナー

シェルスクリプト(bash)でforやwhileを使っての繰り返し処理を、ワンライナーで書く方法です。(自分用備忘録)

forによる繰り返し

基本はこんな感じです。

for i in リスト; do コマンド; done

リスト部分にはブレーズ展開({}で括る)や算術式、コマンドの実行結果やなども使用することができます。

for i in 数字1 数字2 数字3; do コマンド; done
for i in {スタート..エンド}; do コマンド; done
for (( i=スタート; i<エンド; i++ )); do コマンド; done 
array=(リスト); for i in ${array[@]}; do echo $i;done
for i in `コマンド`; do コマンド; done
for i in $(コマンド); do コマンド; done

実行例

どれも1から3までを表示させるワンライナーです。

for i in 1 2 3; do echo $i; done
for i in {1..3}; do echo $i; done
for (( i=1; i<4; i++ )); do echo $i ; done
array=(1 2 3); for i in ${array[@]}; do echo $i;done

どちらもtest.txtのファイルをcatで開いてその内容を表示させるワンライナーです

for i in `cat test.txt`; do echo $i; done
for i in $(cat test.txt); do echo $i; done

テストファイルの作成

こんな感じに/dev/zeroや/dev/randomを使って、簡単にテスト用ファイルを作成させることもできます。

コマンド部分は$()や``で括ります。

for i in {1..5}; do $(dd if=/dev/zero of=file_$i bs=1000 count=5000); done
for i in {1..5}; do `dd if=/dev/random of=file_$i bs=1000 count=5000`; done

ddでテストファイルを作成する方法はこちらのページで解説しています。

https://www.server-memo.net/tips/test-data.html

whileによる繰り返し

whileを使って繰り返しを処理を実行するワンライナーの書き方です。

while 条件; do 処理; done

回数指定

変数iを先に指定して、指定した数まで処理を実行させます。

下記は1から3までを表示させるワンライナーです。

i=1; while [ $i -le 3 ]; do echo $i;  i=`expr $i + 1`; done
i=1; while ((i < 4)); do echo $i; i=$(( i + 1 )); done

無限ループ

whileで「true」や「:」を指定することで、無限ループさせることができます。

ループを終了させるにはCtrl + c で終了させることができます。

注意点としては、sleepを入れないとものすごい勢いで処理が実行され続けてしまいます。

while true; do コマンド;sleep 時間; done
while :; do コマンド;sleep 時間; done

下記はどちらも時刻を表示させるdateコマンドを、5秒ごとに表示させています。

$ while true; do date;sleep 5; done
2022年 12月  3日 土曜日 10:29:37 JST
2022年 12月  3日 土曜日 10:29:42 JST
2022年 12月  3日 土曜日 10:29:47 JST
^C  ### Ctrl + cで終了

$ while :; do date;sleep 5; done
2022年 12月  3日 土曜日 10:29:58 JST
2022年 12月  3日 土曜日 10:30:03 JST
2022年 12月  3日 土曜日 10:30:08 JST
^C   ### Ctrl + cで終了

ファイルから読み込み

while readでファイルを読み込みechoで内容を表示させます。

while read line; do echo "$line"; done < ファイル

test.txtのファイルを読み込み、内容を表示させています。

$ while read line; do echo "$line"; done < ./test.txt 
test_1
test_2
test_3

コメント

タイトルとURLをコピーしました