Linuxのシェルスクリプトでキーボードから入力を受け付ける必要があるときがある。
このページではその方法をサンプルのスクリプトともにご紹介した。参考にしてほしい。
目次
キーボードから入力を受け付ける
キーボード入力を受け付けたいとき
スクリプトを記述しているときにふと「ユーザのキーボードから入力を受付けてほしい」というときがあると思う。
例えば、ステージ環境から本番環境に移すときに、どの部分を移すかをキーボードで選択するなどだ。
その場合「read」を使用するとそれが実現できる。基本的にUnix Like Systemではコマンドは対話的でないほうが自動化において有利にはたらくことが多いが、実際にオペレートしてみると、「ここだけは一度確認をとらなければ」というシーン、もしくは単純に対話的であってほしい、ということもあるだろう。
そういった場合に、繰り返しの前や処理の分岐前などにユーザに確認や入力をもとめることができる。bashの場合タイムアウトなどの設定も可能となっている。
なおreadはシェルに内蔵されている「組み込みコマンド」である。そのため/usr/bin/の下にコマンドがあるわけではないので注意しよう。
実際に使ってみよう
実際に試して見る。
サンプルコード
vi test-read.sh
1 2 3 4 5 6 7 |
#!/usr/bin/bash #プロンプトをechoを使って表示 echo -n INPUT_STR: #入力を受付、その入力を「str」に代入 read str #結果を表示 echo $str |
出力結果
1 2 |
INPUT_STR:abcd abcd |
極限までシンプルにした例となったが、これで標準入力から入力を受取、変数へ代入することができるようになった。これから先変数を自由に扱い処理してゆくことになる。
まだ説明していない変数というものがあるが、今は「str」が変数という器で先頭に「$」がつくと参照できるという認識で問題ない。
複数の入力を受付ける
また複数の変数を同時に受け取ることも可能となっている。
サンプルコード
vi test-read-ver2.sh
1 2 3 4 5 6 |
#!/usr/bin/bash echo -n INPUT_STR: #一度に複数の変数へ入力、スペースで区切る read str1 str2 str3 #結果を表示する。 echo $str1 $str2 $str3 |
出力結果
その他とBash固有オプション
その他readはwhileと組み合わせて使用することが多い、このwhileは繰り返しの制御文でreadと組み合わせると一行ずつファイルの内容を読み込むことができる。
このとき「\」(バックスラッシュ)は特殊文字として扱われるため処理がうまくいかないときがある「\」を無視したい場合「-r」オプションを使用することで「\」も通常の文字列として処理される。
ほかにもBash固有のオプションとして幾つかオプションが存在している
- -p プロンプトを表示する
- -t タイムアウトを設定する。
-pオプション実例
「-p」オプションを指定することにより、事前にechoコマンドをはさむ必要がなくなる。
サンプルコード
vi test-read-ver3.sh
1 2 3 4 |
#!/usr/bin/bash # -pでプロンプトを表示してくれる read -p "INPUT:" str1 str2 str3 echo $str1 $str2 $str3 |
出力結果
-tオプション実例
「-t」 オプションでタイムアウトを指定すると指定した時間だけ入力を受け付けてくれる。
サンプルコード
vi test-read-ver4.sh
1 2 3 4 |
#!/usr/bin/bash #10秒間入力を受付ける。 read -t 10 -p "INPUT:" str1 str2 str3 echo $str1 $str2 $str3 |
出力結果
1 2 |
INPUT: aaa bbb ccc aaa bbb ccc |
10秒間の間入力を受け付けてくれる、何も入力されなかった場合、そのままプロンプトが返ってくる。
とりあえず入力待ち
またreadはとりあえず処理をとめてEnter入力待ちをしたいときも有用である。
サンプルコード
vi test-read-ver5.sh
1 2 3 4 5 6 7 |
#!/usr/bin/bash read -p "入力待ち Enterを押してください>" echo enter1 read -p "入力待ち Enterを押してください>" echo enter2 read -p "入力待ち Enterを押してください>" echo enter3 |
出力結果
1 2 3 4 5 6 |
入力待ち Enterを押してください> enter1 入力待ち Enterを押してください> enter2 入力待ち Enterを押してください enter3 |
まとめ
このページではシェルスクリプトでキーボードからの入力を扱う方法についてまとめてきた。
シェルスクリプトでは必ず使う機能だ。使って覚えてしまうのが吉だ。