「シェルスクリプトの基礎 - 繰り返し文」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…
 
(同じ利用者による、間の4版が非表示)
214行目: 214行目:
以下のサンプルコードでは、変数iが6より小さい間だけ、変数iに代入された値をechoで表示した後、<br>
以下のサンプルコードでは、変数iが6より小さい間だけ、変数iに代入された値をechoで表示した後、<br>
exprコマンドを使用して変数iに1を加算する。<br>
exprコマンドを使用して変数iに1を加算する。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
223行目: 223行目:
     i=`expr $i + 1`
     i=`expr $i + 1`
  done
  done
  </source>
  </syntaxhighlight>
<br>
<br>
  # 出力
  # 出力
229行目: 229行目:
<br>
<br>
bashのみだが、exprコマンドは遅いので(())を使用した算術式の方が処理が速い。<br>
bashのみだが、exprコマンドは遅いので(())を使用した算術式の方が処理が速い。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
238行目: 238行目:
     i=$(( i + 1 ))
     i=$(( i + 1 ))
  done
  done
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


244行目: 244行目:
条件の指定にはtestコマンド(または[]コマンド)を使用する場合が多いが、それ以外も条件として指定することができる。<br>
条件の指定にはtestコマンド(または[]コマンド)を使用する場合が多いが、それ以外も条件として指定することができる。<br>
<br>
<br>
===== ファイルから読み込む =====
==== ファイルから読み込む ====
readコマンドを使用してlist.txtファイルの内容を読み込み、1行ずつ表示させる。<br>
readコマンドを使用してlist.txtファイルの内容を読み込み、1行ずつ表示させる。<br>
以下のシェルスクリプトを実行すると、list.txtファイルの内容を1行ずつ読み込み、その内容が表示される。<br>
以下のシェルスクリプトを実行すると、list.txtファイルの内容を1行ずつ読み込み、その内容が表示される。<br>
252行目: 252行目:
  ghi
  ghi
<br>
<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
259行目: 259行目:
     echo "$line"
     echo "$line"
  done < ./list.txt
  done < ./list.txt
  </source>
   
<br>
  # 出力
  # 出力
  abc
  abc
  def
  def
  ghi
  ghi
</syntaxhighlight>
<br>
<br>
 
==== 無限ループ ====
===== 無限ループ =====
条件にNULLコマンドである:(コロン)を指定すると、無限ループになる。<br>
条件にNULLコマンドである:(コロン)を指定すると、無限ループになる。<br>
NULLコマンド:は、何もせずに終了コード0(真)を返すので、条件が常に真となるため、無限ループになる。<br>
NULLコマンド:は、何もせずに終了コード0(真)を返すので、条件が常に真となるため、無限ループになる。<br>
273行目: 272行目:
無限ループを終了させるには、Ctrlキー + Cキーで強制的に終了させるか、<br>
無限ループを終了させるには、Ctrlキー + Cキーで強制的に終了させるか、<br>
処理部分でif文またはcase文などの条件分岐で、<code>break</code>、<code>return</code>、<code>exit</code>コマンドを実行する。<br>
処理部分でif文またはcase文などの条件分岐で、<code>break</code>、<code>return</code>、<code>exit</code>コマンドを実行する。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  while :
  while :
  do
  do
     # 処理
     # 処理
  done
  done
  </source>
  </syntaxhighlight>
<br>
<br>
以下の例では、無限ループにcase文(条件分岐)を組み込んでいる。<br>
以下の例では、無限ループにcase文(条件分岐)を組み込んでいる。<br>
287行目: 286行目:
[y]キーまたは[n]キー以外のキーを入力すると、<code>Push y or n key.</code>と表示する。<br>
[y]キーまたは[n]キー以外のキーを入力すると、<code>Push y or n key.</code>と表示する。<br>
その後、[y]キーまたは[n]キーのいずれかを入力するように促すメッセージを表示して、処理を繰り返す。<br>
その後、[y]キーまたは[n]キーのいずれかを入力するように促すメッセージを表示して、処理を繰り返す。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
300行目: 299行目:
     esac
     esac
  done
  done
  </source>
   
<br>
  # 出力
  # 出力
  Repeat? (y/n) :q  ← yキーまたはnキー以外を入力
  Repeat? (y/n) :q  ← yキーまたはnキー以外を入力
309行目: 307行目:
  Repat? (y/n) :n    ← nキーを入力
  Repat? (y/n) :n    ← nキーを入力
  Repeat end.
  Repeat end.
</syntaxhighlight>
<br><br>
<br><br>


314行目: 313行目:
continueコマンドを実行することにより、以降の処理をスキップして、ループの先頭に移動することができる。<br>
continueコマンドを実行することにより、以降の処理をスキップして、ループの先頭に移動することができる。<br>
また、breakコマンドと同様に、引数を指定することにより、ネストされたループ処理を一気にスキップすることも可能である。<br>
また、breakコマンドと同様に、引数を指定することにより、ネストされたループ処理を一気にスキップすることも可能である。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  while 条件式
  while 条件式
  do
  do
321行目: 320行目:
     …
     …
  done
  done
  </source>
  </syntaxhighlight>
<br>
<br>
以下の例では、continueコマンドに引数を渡して、ネストされたループを一気にスキップしている。<br>
以下の例では、continueコマンドに引数を渡して、ネストされたループを一気にスキップしている。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  #!/bin/bash
  #!/bin/bash
   
   
355行目: 354行目:
     done
     done
  done
  done
  </source>
  </syntaxhighlight>
<br>
<br>
上記の例の実行結果は、以下の通りである。<br>
上記の例の実行結果は、以下の通りである。<br>
375行目: 374行目:
以下の例では、<code>break</code>コマンドに2を指定して実行することにより、2重ループを一気に抜けている。<br>
以下の例では、<code>break</code>コマンドに2を指定して実行することにより、2重ループを一気に抜けている。<br>
同様に、2重ループの先頭(1つ目のwhile文の先頭)に戻る場合は、<code>continue</code>コマンドの引数に2を指定して実行する。<br>
同様に、2重ループの先頭(1つ目のwhile文の先頭)に戻る場合は、<code>continue</code>コマンドの引数に2を指定して実行する。<br>
  <source lang="sh">
  <syntaxhighlight lang="sh">
  while : # 1つ目のループ
  while : # 1つ目のループ
  do
  do
390行目: 389行目:
     done
     done
  done
  done
  </source>
  </syntaxhighlight>
<br><br>
<br><br>
== コマンドのグルーピングと繰り返し処理 ==
==== コマンドのグルーピング ====
シェル上でコマンドを実行する時、以下のように、コマンドを括弧()で囲みグルーピングすると、<br>
リダイレクト等が全てのコマンドに対して動くようになる。<br>
(command1; command2; command3)
# 例
(echo 'AAA'; echo 'BBB'; echo 'CCC') > output.txt
<br>
また、以下のように、複数行に分けて記述することもできる。<br>
この場合、各コマンドの末尾にセミコロン;は必要ない。<br>
(
  echo 'AAA'
  echo 'BBB'
  echo 'CCC'
) > output.txt
<br>
グルーピングしたコマンドの出力をパイプ処理で繋ぐこともできる。<br>
(
  echo 'foo'
  echo 'bar'
  echo 'yahoo'
  echo 'foo'
) | sort | uniq
<br>
グルーピングしたコマンドは子シェルで実行されるため、<br>
子シェル内でカレントディレクトリや環境変数等を変更した場合、コマンド終了時に元に戻る。<br>
これは、一時的にカレントディレクトリを変更して、コマンドを実行する場合に便利である。<br>
pwd
/home
(cd /etc; pwd)
/etc
pwd
/home
<br>
==== ループ内の出力をリダイレクトする ====
for文やwhile文の内部でechoコマンドを実行した結果は、doneの直後にリダイレクトを記述することで、まとめてファイルに出力できる。<br>
<syntaxhighlight lang="sh">
for x in AAA BBB CCC
do
    echo "$x"
    echo "......"
done > output.txt
# 出力(output.txt)
AAA
......
BBB
......
CCC
......
</syntaxhighlight>
<br>
==== ループ内の出力をパイプで接続する ====
ループ内の出力結果は、パイプ処理|で別のコマンドに繋ぐことができる。<br>
<syntaxhighlight lang="sh">
for x in CCC AAA DDD EEE BBB
do
    echo $x
done | sort
# 出力
AAA
BBB
CCC
DDD
EEE
</syntaxhighlight>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:シェルスクリプト]]
[[カテゴリ:シェルスクリプト]]