MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
シェルスクリプトの基礎 - 繰り返し文のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
シェルスクリプトの基礎 - 繰り返し文
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == 繰り返し文は、変数にリストで指定した値を順番に代入し、その度にdoからdoneまでの処理を実行し、<br> リストの値を全てを代入し処理が完了したら繰り返しは終了となる。<br> <br><br> == for文の基本 == 変数iに1から5までの数字を指定して、変数に代入された値をechoで表示させるというサンプルコードを以下に記述する。<br> <syntaxhighlight lang="sh"> #!/bin/bash for i in 1 2 3 4 5 do echo $i done # 出力 1 2 3 4 5 </syntaxhighlight> <br> 以下の例では、ループ処理するテキスト(aaa、bbb、ccc)をfor文で指定している。<br> <syntaxhighlight lang="sh"> #!/bin/bash # 例 : aaa bbb cccを順番に処理する for x in aaa bbb ccc; do echo $x done # 出力 aaa bbb ccc </syntaxhighlight> <br> 以下の例では、リスト内の各要素をダブルクォーテーションで囲み、その単位で繰り返し処理している。<br> <syntaxhighlight lang="sh"> #!/bin/bash for i in "aaa bbb" "ccc ddd" "eee fff" do echo $i done # 出力 aaa bbb ccc ddd eee fff </syntaxhighlight> <br> 以下の例では、各変数をダブルクォーテーションで囲み、その単位で繰り返し処理している。<br> もし、ダブルクォーテーションを付けない場合、各変数内の文字列がスペースで区切られて繰り返し処理される。<br> <syntaxhighlight lang="sh"> #!/bin/bash x="aaa bbb" y="ccc ddd" z="eee fff" for i in "$x" "$y" "$z" do echo $i done # 出力 aaa bbb ccc ddd eee fff </syntaxhighlight> <br><br> == for文におけるリストの指定 == リストの指定方法を以下に記載する。<br> <br> ==== コマンドの実行結果の使用 ==== リスト部分には、コマンドの実行結果を値として使用でき、その場合は、コマンドをバッククォート(`)で囲む必要がある。<br> <syntaxhighlight lang="sh"> #!/bin/bash for file in `ls /var/log/messages*` do echo $file done # 出力 /var/log/messages /var/log/messages-20170618 /var/log/messages-20170626 /var/log/messages-20170702 /var/log/messages-20170710 </syntaxhighlight> <br> また、<span style="color:#C00000"><u>'''bashの場合'''</u></span>は、$()も使用できる。<br> <syntaxhighlight lang="sh"> #!/bin/bash for file in $(ls /var/log/messages*) do echo $file done </syntaxhighlight> <br> ==== <code>seq</code>コマンドの使用 ==== <code>seq</code>コマンドは、指定した開始の数値から終わりの数値までを表示するというコマンドで、繰り返す回数を指定することができる。<br> 例えば、1から5までをリストとして指定する場合は、<code>seq 1 5</code>と指定する。<br> <br> また、開始が1からの場合は、開始の数値を省略することもできる。<br> <code>seq 1 5</code><br> または<br> <code>seq 5</code><br> または<br> <code>seq 1 1 5</code><br> <br> seqコマンドを使用して、1から5までを範囲指定して、ファイルを作成するというスクリプトを記述する。<br> file_1からfile_5までのファイルが作成される。<br> <syntaxhighlight lang="sh"> #!/bin/bash for data in `seq 5` do touch file_$data done </syntaxhighlight> <br> また、wオプションを使用して、ゼロパディングすることもできる。<br> # 01から10までを出力する seq -w 1 10 <br> ==== ブレーズ展開 ==== <span style="color:#C00000"><u>'''bashの場合'''</u></span>、ブレーズ展開機能を使用してリストを指定することもできる。<br> ブレーズ展開は、{開始..最後}といった形式で指定することで、簡単に範囲を指定することができる。<br> <br> 例えば、{1..5}で1から5を指定する場合、以下のように記述する。<br> <syntaxhighlight lang="sh"> #!/bin/bash for i in {1..5} do echo $i done </syntaxhighlight> <br> ==== 算術式の使用 ==== <span style="color:#C00000"><u>'''bashの場合'''</u></span>、以下のように、1から5までを指定することもできる。<br> <syntaxhighlight lang="sh"> #!/bin/bash for ((i=1; i<6; i++)) do echo $i done </syntaxhighlight> <br> ==== ファイルの読み込み ==== 事前にリストに読み込ませるファイルを作成しておき、catコマンド等でファイルの中身を読み込むという方法ある。<br> list.txtファイルを事前に作成して、catコマンドでファイルの中身を読み込む。<br> <syntaxhighlight lang="sh"> #!/bin/bash for i in `cat list.txt` do echo $i done </syntaxhighlight> <br> ==== コマンドライン引数の使用 ==== リスト部分に"@$"を使用すると、シェルスクリプトを実行する際の引数を、リストの値にすることができる。<br> <syntaxhighlight lang="sh"> #!/bin/bash for i in "$@" do echo $i done </syntaxhighlight> <br> ==== 配列変数の使用 ==== 配列を使用してリストを指定することもできる。<br> 配列arrayに1から5を設定して、それをリスト部分で呼び出す。<br> <syntaxhighlight lang="sh"> #!/bin/bash array=(1 2 3 4 5) for i in ${array[@]} do echo $i done </syntaxhighlight> <br><br> == while文 == 以下のサンプルコードでは、変数iが6より小さい間だけ、変数iに代入された値をechoで表示した後、<br> exprコマンドを使用して変数iに1を加算する。<br> <source lang="sh"> #!/bin/bash i=1 while [ $i -lt 6 ] do echo "$i" i=`expr $i + 1` done </source> <br> # 出力 1 2 3 4 5 <br> bashのみだが、exprコマンドは遅いので(())を使用した算術式の方が処理が速い。<br> <source lang="sh"> #!/bin/bash i=1 while ((i < 6)) do echo $i i=$(( i + 1 )) done </source> <br><br> == while文における条件の指定 == 条件の指定にはtestコマンド(または[]コマンド)を使用する場合が多いが、それ以外も条件として指定することができる。<br> <br> ===== ファイルから読み込む ===== readコマンドを使用してlist.txtファイルの内容を読み込み、1行ずつ表示させる。<br> 以下のシェルスクリプトを実行すると、list.txtファイルの内容を1行ずつ読み込み、その内容が表示される。<br> # list.txtファイルの内容 abc def ghi <br> <source lang="sh"> #!/bin/bash while read line do echo "$line" done < ./list.txt </source> <br> # 出力 abc def ghi <br> ===== 無限ループ ===== 条件にNULLコマンドである:(コロン)を指定すると、無限ループになる。<br> NULLコマンド:は、何もせずに終了コード0(真)を返すので、条件が常に真となるため、無限ループになる。<br> <br> 無限ループを終了させるには、Ctrlキー + Cキーで強制的に終了させるか、<br> 処理部分でif文またはcase文などの条件分岐で、<code>break</code>、<code>return</code>、<code>exit</code>コマンドを実行する。<br> <source lang="sh"> while : do # 処理 done </source> <br> 以下の例では、無限ループにcase文(条件分岐)を組み込んでいる。<br> <br> <code>Repeat? (y/n) :</code>を表示した後、[y]キーを入力すると"Repeat!"と表示して処理が繰り返され、<br> [n]キーを入力すると、<code>Repeat end.</code>と表示して処理を終了させる。<br> <br> [y]キーまたは[n]キー以外のキーを入力すると、<code>Push y or n key.</code>と表示する。<br> その後、[y]キーまたは[n]キーのいずれかを入力するように促すメッセージを表示して、処理を繰り返す。<br> <source lang="sh"> #!/bin/bash while : do read -p "Repat? (y/n) :" key case "$key" in y) echo "Repeat!";; n) echo "Repeat end." break ;; *) echo "Push y or n key.";; esac done </source> <br> # 出力 Repeat? (y/n) :q ← yキーまたはnキー以外を入力 Push y or n key. Repat? (y/n) :y ← yキーを入力 Repeat! Repat? (y/n) :n ← nキーを入力 Repeat end. <br><br> == continueコマンド == continueコマンドを実行することにより、以降の処理をスキップして、ループの先頭に移動することができる。<br> また、breakコマンドと同様に、引数を指定することにより、ネストされたループ処理を一気にスキップすることも可能である。<br> <source lang="sh"> while 条件式 do … continue … done </source> <br> 以下の例では、continueコマンドに引数を渡して、ネストされたループを一気にスキップしている。<br> <source lang="sh"> #!/bin/bash # 最初のexitコマンド回避用フラグ SKIP="ON" while : do if [ "$SKIP" != "ON" ]; then echo "continue 2 が実行されました." exit 0 fi # 以降のループでは上の処理をスキップしない SKIP="" while : do if [ "$CNT" = "ON" ]; then echo "continue が実行されました." continue 2 fi # continue フラグを立てる CNT="ON" continue # continue フラグをオフにする CNT="" done done </source> <br> 上記の例の実行結果は、以下の通りである。<br> <br> 最初のメッセージは、変数CNTにフラグを立てた後、continueコマンドを実行するために出力している。<br> 次に、continue 2が実行されて、処理が1つ上のwhile文の先頭に移動する。<br> 変数SKIPは、2段目の繰り返し処理に入る直前でオフにするので、continue 2コマンドを実行した後、メッセージを出力して終了する。<br> continue が実行されました. continue 2 が実行されました. <br><br> == 多重ループの制御 == <code>break</code>コマンドおよび<code>continue</code>コマンドは、数値を指定することにより、ネストされた多重ループを越えた移動ができる。<br> つまり、指定した数値の分だけ、上の階層のループを対象に実行される。<br> 引数を省略した場合は、1を指定した場合と同じ動作になる。<br> break <数値> continue <数値> <br> 以下の例では、<code>break</code>コマンドに2を指定して実行することにより、2重ループを一気に抜けている。<br> 同様に、2重ループの先頭(1つ目のwhile文の先頭)に戻る場合は、<code>continue</code>コマンドの引数に2を指定して実行する。<br> <source lang="sh"> while : # 1つ目のループ do ... while : # 2つ目のループ do ... # 1つ目のwhile文の先頭に戻る continue 2 ... # 1つ目のwhile文から抜ける break 2 ... done done </source> <br><br> __FORCETOC__ [[カテゴリ:シェルスクリプト]]
シェルスクリプトの基礎 - 繰り返し文
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse