どうも、シローです。
今回はread
コマンドについての整理をしようと思います。
readコマンドとは
read
コマンドは標準入力から文字列を受け取って変数に格納することができるコマンドです。
readコマンドの書式
1 |
read 変数1 変数2 |
使用例
1 2 3 4 5 6 |
$ read input1 input2 hoge fuga $ echo $input1 hoge $ echo $input2 fuga |
スペース区切りで入力した文字列がそれぞれの変数に格納されます。
readコマンドの用途
read
コマンドの主に次のような使い方ができます。
ユーザからの入力を必要として、処理を分岐する時
プログラムの途中でユーザから入力を受け取って、その値によって処理を変更するときに使えます。
次のプログラムは合計が100以上になるまで、数値を読み取って加算するプログラムです。
loop_read_number.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/bash sum=0 loop=1 while [[ $loop -eq 1 ]] do echo "数値を入力してください" read number if expr "$number" : "[0-9]*$" > /dev/null; then sum=$((sum + number)) fi echo "合計値 : $sum" if [ $sum -ge 100 ]; then loop=0 echo "終了します" fi done |
実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ bash loop_read_number.sh 数値を入力してください 10 合計値 : 10 数値を入力してください 20 合計値 : 30 数値を入力してください 30 合計値 : 60 数値を入力してください 35 合計値 : 95 数値を入力してください 5 合計値 : 100 終了します |
ファイルの内容を1行ずつ読み取り、その文字列を評価して処理を行う時
cat
コマンドなどで読み取ったファイルの内容を一行ずつ読み取って処理を行う時にも使えます。
次のプログラムでは、ファイルの中に禁止ワード(うんこ)が含まれていれば、それらのワードを「****」に変換して出力します。
check_ng_word.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/bash ng_word='うんこ' while read line do if echo $line | grep $ng_word > /dev/null; then line=$(echo $line | sed "s/$ng_word/****/g") echo $line else echo $line fi done |
サンプルテキスト sample.txt
1 2 3 4 5 |
親譲りの無鉄砲で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事がある。 なぜそんな無闇をしたと聞く人があるかも知れぬ。別段深い理由でもない。 新築の二階から首を出していたら、同級生の一人が冗談に、いくら威張っても、そこから飛び"うんこ"降りる事は出来まい。 弱虫やーい。と囃したからである。 小使に負ぶさって帰って来た時、おやじが大きな眼をして二階ぐらいから"うんこ"飛び降りて腰を抜かす奴があるかと云ったから、この次は抜かさずに飛んで見せますと答えた。(青空文庫より) |
実行
1 2 3 4 5 6 |
$ cat sample.txt | bash check_ng_word.sh 親譲りの無鉄砲で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事がある。 なぜそんな無闇をしたと聞く人があるかも知れぬ。別段深い理由でもない。 新築の二階から首を出していたら、同級生の一人が冗談に、いくら威張っても、そこから飛びu"****"降りる事は出来まい。 弱虫やーい。と囃したからである。 小使に負ぶさって帰って来た時、おやじが大きな眼をして二階ぐらいから"****"飛び降りて腰を抜かす奴があるかと云ったから、この次は抜かさずに飛んで見せますと答えた。(青空文庫より) |
まとめ
read
コマンドは標準入力で読み取った文字列を変数に格納することができる- ユーザのキーボード入力や読み取ったファイルの内容を変数に格納して処理に利用する際に利用できる