📢 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… |
|||
| (同じ利用者による、間の9版が非表示) | |||
| 4行目: | 4行目: | ||
<br><br> | <br><br> | ||
== | == for文の基本 == | ||
変数iに1から5までの数字を指定して、変数に代入された値をechoで表示させるというサンプルコードを以下に記述する。<br> | 変数iに1から5までの数字を指定して、変数に代入された値をechoで表示させるというサンプルコードを以下に記述する。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 13行目: | 13行目: | ||
echo $i | echo $i | ||
done | done | ||
# 出力 | # 出力 | ||
1 | 1 | ||
| 21行目: | 20行目: | ||
4 | 4 | ||
5 | 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> | |||
for文に渡す処理を<code>{ }</code>を使用してグルーピングする場合、各グループ内の要素の組み合わせで繰り返し処理できる。<br> | |||
<syntaxhighlight lang="sh"> | |||
#!/bin/bash | |||
for X in {A,B,C}-{1,2} | |||
do | |||
echo $X | |||
done | |||
# 出力 | |||
A-1 | |||
A-2 | |||
B-1 | |||
B-2 | |||
C-1 | |||
C-2 | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
| 26行目: | 95行目: | ||
リストの指定方法を以下に記載する。<br> | リストの指定方法を以下に記載する。<br> | ||
<br> | <br> | ||
==== コマンドの実行結果の使用 ==== | |||
リスト部分には、コマンドの実行結果を値として使用でき、その場合は、コマンドをバッククォート(`)で囲む必要がある。<br> | リスト部分には、コマンドの実行結果を値として使用でき、その場合は、コマンドをバッククォート(`)で囲む必要がある。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 35行目: | 104行目: | ||
echo $file | echo $file | ||
done | done | ||
# 出力 | # 出力 | ||
/var/log/messages | /var/log/messages | ||
| 43行目: | 111行目: | ||
/var/log/messages-20170702 | /var/log/messages-20170702 | ||
/var/log/messages-20170710 | /var/log/messages-20170710 | ||
</syntaxhighlight> | |||
<br> | <br> | ||
また、<span style="color:#C00000"><u>'''bashの場合'''</u></span>は、$()も使用できる。<br> | また、<span style="color:#C00000"><u>'''bashの場合'''</u></span>は、$()も使用できる。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 52行目: | 121行目: | ||
echo $file | echo $file | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br> | |||
==== <code>seq</code>コマンドの使用 ==== | |||
<code>seq</code>コマンドは、指定した開始の数値から終わりの数値までを表示するというコマンドで、繰り返す回数を指定することができる。<br> | |||
例えば、1から5までをリストとして指定する場合は、<code>seq 1 5</code>と指定する。<br> | |||
<br> | <br> | ||
また、開始が1からの場合は、開始の数値を省略することもできる。<br> | また、開始が1からの場合は、開始の数値を省略することもできる。<br> | ||
<code>seq 1 5</code><br> | |||
または<br> | |||
<code>seq 5</code><br> | |||
または<br> | |||
<code>seq 1 1 5</code><br> | |||
<br> | <br> | ||
seqコマンドを使用して、1から5までを範囲指定して、ファイルを作成するというスクリプトを記述する。<br> | seqコマンドを使用して、1から5までを範囲指定して、ファイルを作成するというスクリプトを記述する。<br> | ||
file_1からfile_5までのファイルが作成される。<br> | file_1からfile_5までのファイルが作成される。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 74行目: | 143行目: | ||
touch file_$data | touch file_$data | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
また、wオプションを使用して、ゼロパディングすることもできる。<br> | また、wオプションを使用して、ゼロパディングすることもできる。<br> | ||
| 80行目: | 149行目: | ||
seq -w 1 10 | seq -w 1 10 | ||
<br> | <br> | ||
==== ブレーズ展開 ==== | |||
<span style="color:#C00000"><u>'''bashの場合'''</u></span>、ブレーズ展開機能を使用してリストを指定することもできる。<br> | <span style="color:#C00000"><u>'''bashの場合'''</u></span>、ブレーズ展開機能を使用してリストを指定することもできる。<br> | ||
ブレーズ展開は、{開始..最後}といった形式で指定することで、簡単に範囲を指定することができる。<br> | ブレーズ展開は、{開始..最後}といった形式で指定することで、簡単に範囲を指定することができる。<br> | ||
<br> | <br> | ||
例えば、{1..5}で1から5を指定する場合、以下のように記述する。<br> | 例えば、{1..5}で1から5を指定する場合、以下のように記述する。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 92行目: | 161行目: | ||
echo $i | echo $i | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
==== 算術式の使用 ==== | |||
<span style="color:#C00000"><u>'''bashの場合'''</u></span>、以下のように、1から5までを指定することもできる。<br> | <span style="color:#C00000"><u>'''bashの場合'''</u></span>、以下のように、1から5までを指定することもできる。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 103行目: | 172行目: | ||
echo $i | echo $i | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
==== ファイルの読み込み ==== | |||
事前にリストに読み込ませるファイルを作成しておき、catコマンド等でファイルの中身を読み込むという方法ある。<br> | 事前にリストに読み込ませるファイルを作成しておき、catコマンド等でファイルの中身を読み込むという方法ある。<br> | ||
list.txtファイルを事前に作成して、catコマンドでファイルの中身を読み込む。<br> | list.txtファイルを事前に作成して、catコマンドでファイルの中身を読み込む。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 115行目: | 184行目: | ||
echo $i | echo $i | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
==== コマンドライン引数の使用 ==== | |||
リスト部分に"@$"を使用すると、シェルスクリプトを実行する際の引数を、リストの値にすることができる。<br> | リスト部分に"@$"を使用すると、シェルスクリプトを実行する際の引数を、リストの値にすることができる。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 126行目: | 195行目: | ||
echo $i | echo $i | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
==== 配列変数の使用 ==== | |||
配列を使用してリストを指定することもできる。<br> | 配列を使用してリストを指定することもできる。<br> | ||
配列arrayに1から5を設定して、それをリスト部分で呼び出す。<br> | 配列arrayに1から5を設定して、それをリスト部分で呼び出す。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 139行目: | 208行目: | ||
echo $i | echo $i | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 145行目: | 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 | ||
| 154行目: | 223行目: | ||
i=`expr $i + 1` | i=`expr $i + 1` | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
# 出力 | # 出力 | ||
| 160行目: | 229行目: | ||
<br> | <br> | ||
bashのみだが、exprコマンドは遅いので(())を使用した算術式の方が処理が速い。<br> | bashのみだが、exprコマンドは遅いので(())を使用した算術式の方が処理が速い。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 169行目: | 238行目: | ||
i=$(( i + 1 )) | i=$(( i + 1 )) | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 175行目: | 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> | ||
| 183行目: | 252行目: | ||
ghi | ghi | ||
<br> | <br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 190行目: | 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> | ||
<br> | |||
無限ループを終了させるには、Ctrlキー + Cキーで強制的に終了させるか、<br> | 無限ループを終了させるには、Ctrlキー + Cキーで強制的に終了させるか、<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> | |||
<br> | <br> | ||
<code>Repeat? (y/n) :</code>を表示した後、[y]キーを入力すると"Repeat!"と表示して処理が繰り返され、<br> | |||
[n]キーを入力すると、<code>Repeat end.</code>と表示して処理を終了させる。<br> | |||
<br> | <br> | ||
[y]キーまたは[n]キー以外のキーを入力すると、<code>Push y or n key.</code>と表示する。<br> | |||
その後、[y]キーまたは[n]キーのいずれかを入力するように促すメッセージを表示して、処理を繰り返す。<br> | |||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 230行目: | 299行目: | ||
esac | esac | ||
done | done | ||
# 出力 | # 出力 | ||
Repeat? (y/n) :q ← yキーまたはnキー以外を入力 | Repeat? (y/n) :q ← yキーまたはnキー以外を入力 | ||
| 239行目: | 307行目: | ||
Repat? (y/n) :n ← nキーを入力 | Repat? (y/n) :n ← nキーを入力 | ||
Repeat end. | Repeat end. | ||
</syntaxhighlight> | |||
<br><br> | |||
== continueコマンド == | |||
continueコマンドを実行することにより、以降の処理をスキップして、ループの先頭に移動することができる。<br> | |||
また、breakコマンドと同様に、引数を指定することにより、ネストされたループ処理を一気にスキップすることも可能である。<br> | |||
<syntaxhighlight lang="sh"> | |||
while 条件式 | |||
do | |||
… | |||
continue | |||
… | |||
done | |||
</syntaxhighlight> | |||
<br> | |||
以下の例では、continueコマンドに引数を渡して、ネストされたループを一気にスキップしている。<br> | |||
<syntaxhighlight 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 | |||
</syntaxhighlight> | |||
<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> | |||
<syntaxhighlight lang="sh"> | |||
while : # 1つ目のループ | |||
do | |||
... | |||
while : # 2つ目のループ | |||
do | |||
... | |||
# 1つ目のwhile文の先頭に戻る | |||
continue 2 | |||
... | |||
# 1つ目のwhile文から抜ける | |||
break 2 | |||
... | |||
done | |||
done | |||
</syntaxhighlight> | |||
<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> | <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__ | ||
[[カテゴリ:シェルスクリプト]] | [[カテゴリ:シェルスクリプト]] | ||