📢 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> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 223行目: | 223行目: | ||
i=`expr $i + 1` | i=`expr $i + 1` | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
# 出力 | # 出力 | ||
| 229行目: | 229行目: | ||
<br> | <br> | ||
bashのみだが、exprコマンドは遅いので(())を使用した算術式の方が処理が速い。<br> | bashのみだが、exprコマンドは遅いので(())を使用した算術式の方が処理が速い。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 238行目: | 238行目: | ||
i=$(( i + 1 )) | i=$(( i + 1 )) | ||
done | done | ||
</ | </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> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 259行目: | 259行目: | ||
echo "$line" | echo "$line" | ||
done < ./list.txt | done < ./list.txt | ||
# 出力 | # 出力 | ||
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> | ||
< | <syntaxhighlight lang="sh"> | ||
while : | while : | ||
do | do | ||
# 処理 | # 処理 | ||
done | done | ||
</ | </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> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 300行目: | 299行目: | ||
esac | esac | ||
done | done | ||
# 出力 | # 出力 | ||
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> | ||
< | <syntaxhighlight lang="sh"> | ||
while 条件式 | while 条件式 | ||
do | do | ||
| 321行目: | 320行目: | ||
… | … | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
以下の例では、continueコマンドに引数を渡して、ネストされたループを一気にスキップしている。<br> | 以下の例では、continueコマンドに引数を渡して、ネストされたループを一気にスキップしている。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 355行目: | 354行目: | ||
done | done | ||
done | done | ||
</ | </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> | ||
< | <syntaxhighlight lang="sh"> | ||
while : # 1つ目のループ | while : # 1つ目のループ | ||
do | do | ||
| 390行目: | 389行目: | ||
done | done | ||
done | done | ||
</ | </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__ | ||
[[カテゴリ:シェルスクリプト]] | [[カテゴリ:シェルスクリプト]] | ||