「シェルスクリプトの基礎 - 入出力」の版間の差分

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

 
(同じ利用者による、間の8版が非表示)
1行目: 1行目:
== 概要 ==
== 概要 ==
ここでは、シェルスクリプトでキーボードからの入力を受け付ける方法を記載する。<br>
Bashにおける入出力は、スクリプトとデータの間でデータを受け渡しするために重要な役割を果たす。<br>
<br>
以下に示す概念を理解することにより、Bashでデータの入力、出力、リダイレクションを適切に行うことができる。<br>
また、パイプを使用してコマンドを連携させることにより、より強力なデータ処理が可能になる。<br>
* 標準入力 (stdin)
*: デフォルトでは、キーボードからの入力を表す。
*: <code>read</code>コマンドを使用して、標準入力からデータを読み込むことができる。
*: <code><</code>記号を使用して、ファイルからデータを読み込むこともできる。
*: <br>
* 標準出力 (stdout)
*: デフォルトでは、コンソールへの出力を表す。
*: <code>echo</code>コマンドを使用して、標準出力にデータを書き込むことができる。
*: また、<code>></code>記号を使用して、ファイルにデータを書き込むこともできる。
*: <br>
*  標準エラー出力 (stderr)
*: エラーメッセージ等の診断出力を表す。
*: デフォルトでは、標準出力と同じ場所 (コンソール) に出力される。
*: <code>2></code>記号を使用して、ファイルにエラー出力を書き込むこともできる。
*: <br>
* リダイレクション
*: <code><</code>、<code>></code>、<code>>></code>等の記号を使用して、標準入力、標準出力、標準エラー出力の向き先を変更することができる。
*: <code>></code>は指定されたファイルに上書きして、<code>>></code>は指定されたファイルに追記する。
*: <br>
* パイプ ( <code>|</code> )
*: 1つのコマンドの標準出力を別のコマンドの標準入力につなげることができる。
*: 複数のコマンドをパイプでつなげることで、データを連続的に処理することができる。
*: <br>
* ヒアドキュメント ( <code><<</code> )
*: 複数行のテキストを標準入力として渡すことができる。
*: <code><<</code>の後にデリミタを指定して、そのデリミタが再度現れるまでの行が標準入力として扱われる。
<br>
入出力の適切な使用は、Bashスクリプトの柔軟性と効率性を高めるために重要である。<br>
<br><br>
<br><br>


== 入力 ==
== 入力 ==
readコマンドを使用することで、キーボードから入力した内容を変数に格納することができる。<br>
<code>read</code>コマンドは、ユーザからの入力を受け取るために使用されるビルトインコマンドである。<br>
<code>read</code>コマンドを使用することにより、スクリプトの実行中に一時停止して、キーボードから入力した内容を変数に格納することができる。<br>
  <syntaxhighlight lang="sh">
  <syntaxhighlight lang="sh">
  read 変数名
  read <オプション> <変数名>
  </syntaxhighlight>
  </syntaxhighlight>
<br>
==== readコマンドのオプション ====
<center>
{| class="wikitable"
|-
! オプション !! 説明
|-
| -a <配列変数名> || 入力した値を配列変数に格納する。
|-
| -n <文字数> || 指定された文字数だけ読み込む。<br>キーボードで直接入力すると、2文字を入力した時点で、自動的に入力処理が終了して値が変数に格納される。<br>また、コピー&ペーストで2文字以上の文字を入力した場合も、指定した分だけが変数に格納される。
|-
| -p <文字列> || コンソールに文字列を表示した後、入力待ちになる。 (ユーザに入力を促すメッセージを表示することができる)<br>改行文字が入力されると、入力の受け付けが終了する。
|-
| -r || \(バックスラッシュ)を文字列として変数に格納する。
|-
| -s || 画面上に入力した文字を表示しない。 (サイレントモード)<br>パスワードの入力等に使用する。
|-
| -t <秒数> || 入力待ち時間に制限を付ける。 (タイムアウト)
|}
</center>
<br>
<br>
==== 入力データの表示 ====
==== 入力データの表示 ====
23行目: 75行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
-pオプションを使用することで、こういう記述方法ができる。<br>
<code>-p</code>オプションを付加することにより、プロンプトメッセージを指定して、ユーザに入力を促すメッセージを表示することができる。<br>
  <syntaxhighlight lang="sh">
  <syntaxhighlight lang="sh">
  read -p "表示する文" 変数名
  read -p "表示する文" 変数名
106行目: 158行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== readコマンドのオプション ====
readコマンドには複数のオプションがあるが、下表によく使用するオプションを記載する。<br>
<center>
{| class="wikitable"
|-
! オプション !! 説明
|-
| -a 変数 || 入力した値を配列変数に格納する。
|-
| -n 文字数 || 文字数で指定した分だけ読み込む。<br>キーボードで直接入力すると、2文字を入力した時点で、自動的に入力処理が終了して値が変数に格納される。<br>また、コピー&ペーストで2文字以上の文字を入力した場合も、指定した分だけが変数に格納される。
|-
| -p 文字列 || 文字列を表示した後、入力待ちになる。<br>改行文字が入力されると、入力の受け付けが終了する。
|-
| -r || \(バックスラッシュ)を文字列として変数に格納する。
|-
| -s || 画面上に入力した文字を表示しない。
|-
| -t 秒数 || 入力待ち時間に制限を付ける。
|}
</center>
<br><br>


== expectコマンド ==
== expectコマンド ==
272行目: 303行目:
  <span style="color:yellow">warn 'Warning message'</span>
  <span style="color:yellow">warn 'Warning message'</span>
  <span style="color:green">info 'Information message'</span>
  <span style="color:green">info 'Information message'</span>
<br>
==== 標準出力 / 標準エラー出力の抑制 ====
<code>>1>/dev/null</code>は、標準出力を破棄する。<br>
<syntaxhighlight lang="sh">
./script.sh 1>/dev/null
</syntaxhighlight>
<br>
<code>>2>/dev/null</code>は、標準エラー出力を破棄する。<br>
<syntaxhighlight lang="sh">
./script.sh 2>/dev/null
</syntaxhighlight>
<br>
また、<code>2>&-</code>でも、標準エラー出力を閉じることができる。<br>
<syntaxhighlight lang="sh">
./script.sh 2>&-
</syntaxhighlight>
<br>
==== ジョブ番号の出力の抑制 ====
ジョブ番号の出力を非表示にするには、いくつかの方法がある。<br>
<br>
* サブシェルを使用する。
*: 括弧でコマンドを囲むことにより、サブシェルで実行されてジョブ番号の出力を抑制する。
*: または、<code>$()</code>でコマンドを囲むことにより、サブシェルで実行される。
*: (aplay $HOME/Login.wav > /dev/null 2>&1 &)
*: $(aplay $HOME/Login.wav > /dev/null 2>&1 &)
<br>
* <code>disown</code>コマンドを使用する。
*: ジョブがシェルのジョブ制御から切り離され、<u>ジョブ完了メッセージのみ</u>が非表示となる。
*: aplay ~/Sample.wav > /dev/null 2>&1 & disown
<br>
* シェルのオプションを変更する。
*: シェルスクリプトの冒頭に以下を追加することにより、ジョブ制御を無効にできる。
*: これにより、バックグラウンドジョブの状態変化の通知が抑制される。
*: <code>set +m</code>
<br><br>
<br><br>


498行目: 563行目:
*: コマンド置換が使用不可。(``および$()がそのまま出力される)
*: コマンド置換が使用不可。(``および$()がそのまま出力される)
*: ヒアドキュメント内の行の先頭にあるタブが無視される。
*: ヒアドキュメント内の行の先頭にあるタブが無視される。
<br>
==== プロセス置換 <() ====
プロセス置換とは、コマンドの出力結果をファイルとして扱う機能である。<br>
例えば、diffコマンドは、引数にファイル以外を指定することができないが、<br>
プロセス置換を使用することで、コマンドの実行結果をdiffコマンドに直接渡すことができる。<br>
<br>
実行結果をファイルとして使用したいコマンドを、< ()で指定する
diff < (command) < (commandA; commandB)
<br>
以下の例のように、プロセス置換は、一時ファイルを作成せずにファイルの置換結果を確認したい場合等に有効である。<br>
# text.txtファイル(置換対象のファイル内容)
hoge
fuga
foo
bar
<br>
# 実行
diff text.txt < (sed -e 's/hoge/HOGE HOGE/' text.txt)
# 出力
1c1
< hoge
---
> HOGE HOGE
<br>
プロセス置換に使用するコマンドは、単一のコマンドのみではなく、セミコロン区切りの複数コマンド、パイプやネストしたプロセス置換も指定可能である。<br>
<br>
以下の例では、diffコマンドを使用して、2つの入力ストリームの差分を表示している。<br>
# echo "aaa"; echo "bbb"
#: まず、aaaとbbbという2行からなる入力ストリームを生成する。
# < (echo "aaa"; echo "bbb")
#: 上記の2行の入力ストリームになる。
#: <はdiffコマンドへのリダイレクトを意味しており、この入力ストリームをdiffの最初の入力として使用する。
# cat <(echo "aaa") | cat <(echo "BBB")
#: <()はプロセス置換を意味する。
#: つまり、括弧内のコマンドの出力をファイルのように扱うことができる。
#: echo "aaa"の出力をcatに渡して、さらに、echo "BBB"の出力をcatに渡して、2つの出力を連結している。
#: 結果として、aaaとBBBという2行のストリームができる。
# echo "ccc"
#: cccという1行のテキストを生成する。
# < (cat <(echo "aaa") | cat <(echo "BBB"); echo "ccc")
#: この括弧内では、上記3.と4.を組み合わせて、aaa、BBB、cccの3行からなるストリームを生成している。
#: そして、<でこのストリームをdiffコマンドの2番目の入力としてリダイレクトしている。
<br>
したがって、このコマンド全体では、aaaとbbbの2行からなるストリームと、aaa、BBB、cccの3行からなるストリームの差分をdiffコマンドで表示している。<br>
# 実行
diff < (echo "aaa"; echo "bbb") < (cat <(echo "aaa") | cat <(echo "BBB"); echo "ccc")
# 出力
1,2c1,2
< aaa
< bbb
---
> BBB
> ccc
<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__
[[カテゴリ:シェルスクリプト]]
[[カテゴリ:シェルスクリプト]]