毎週月曜に打つ集計
シェルスクリプトは、何度も打つコマンドを1つのファイルに書き残し、あとは実行するだけにする方法です。打ち間違いがなくなり、同じ作業をいつでも同じ形で繰り返せます。
通販の店から、毎週、来店数のファイルが届きます。月曜になるたび、同じコマンドを3つ打って、いちばん忙しい日を調べています。ある月曜、打ち間違えて、違う日を上司に送ってしまいました。
このレッスンのゴール
メモ
小さなシェルスクリプトを書いて実行でき、プログラムがどのパッケージから来たか言うことができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| スクリプト | コマンドをファイルに書き残したもの。何度でも実行できる | |
| シバン | スクリプトの1行目。どのプログラムで読むかを書く | #!/bin/bash |
| 引数 | コマンドの後ろに打つ言葉。コマンドが受け取って使う | $1 |
| 終了ステータス | コマンドが残す数字。0なら成功 | $? |
| パッケージ | プログラムと必要なファイルを1つにまとめたもの。システムが入れられる | |
| パッケージマネージャ | パッケージを入れる、更新する、消す道具 | apt |
学生が入力するセルは、このプレビューでは空白です。
1本のパイプで1つの問いに答える
ラボには、来店数の小さなファイル /srv/lab-web/report.csv があります。1行は、曜日、カンマ、人数です。ファイルは英語です。
cut -d, -f1 は1列目だけを取り出します。-d, は列がカンマで区切られているという意味です。tail -n +2 は見出しの行を飛ばします。sort -t, -k2 -n -r は2列目を数として、大きい順に並べます。head -n 1 は先頭の1行だけ残します。
1列目を取り出す
cut -d, -f1 /srv/lab-web/report.csvここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
いちばん忙しい日を探す
tail -n +2 /srv/lab-web/report.csv | sort -t, -k2 -n -r | head -n 1ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
sort は数を大きさで並べると思われがちです。ふつうは文字として並べるので、98 は 175 の後ろに来ます。9 は 1 より後だからです。-n を外すと、上のパイプは Tuesday,98 を出します。数の列には -n を付けましょう。
スクリプトはファイルのコマンド
スクリプトは、コマンドを書いたテキストファイルです。シェルは上から順に、あなたが打ったかのように実行します。
1行目はシバンです。どのプログラムで読むかを書きます。# で始まる行はコメントで、シェルは飛ばします。
スクリプトの中の $1 は、名前の後ろに打った最初の言葉です。だから、どのファイルにも使えます。
スクリプトをファイルに書く
printf '#!/bin/bash\n# CSV ファイルで、いちばん多い日を表示します。\ntail -n +2 "$1" | sort -t, -k2 -n -r | head -n 1\n' > busiest.shここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
実行してみる
./busiest.sh /srv/lab-web/report.csvここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
bash に読ませる
bash busiest.sh /srv/lab-web/report.csvここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
実行できるようにする
chmod +x busiest.shここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
実行する
./busiest.sh /srv/lab-web/report.csvここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
どのコマンドも終了ステータスを残す
コマンドは終わるとき、数字を1つ残します。0 は成功です。それ以外の数字は、何かがうまくいかなかったという印です。
$? には、直前のコマンドが残した数字が入ります。スクリプトや cron は、これで仕事が成功したかを知ります。
失敗するコマンド
ls /nothere ; echo "status $?"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
成功するスクリプト
./busiest.sh /srv/lab-web/report.csv ; echo "status $?"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
cat で見えるファイルなら、実行もできると思われがちです。読む権利と実行する権利は別です。新しいファイルは、だれにも x がありません。先に chmod +x を打つか、bash に読ませましょう。
ソフトはパッケージで届く
Ubuntu では、プログラムはパッケージで届きます。パッケージマネージャは、入っているものと、各ファイルがどのパッケージのものかを覚えています。
dpkg はその一覧を読みます。apt はインターネットから入れるので sudo が要ります。apt-get install に -s を付けると真似るだけなので、安心して試せます。
プログラムはどこにあるか
command -v curlここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
そのファイルはどのパッケージのものか
dpkg -S /usr/bin/curlここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
パッケージは入っているか
dpkg -s curl | grep -E "^(Package|Status)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
もう一度入れる真似をする
apt-get install -s curl 2>&1 | tail -n 3ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: apt の使い方
| 打つコマンド | 何をするか | sudo は要るか |
|---|---|---|
| sudo apt update | 入れられるものの一覧を新しくする | 要る |
| sudo apt install htop | パッケージと、必要なものを入れる | 要る |
| sudo apt remove htop | パッケージを消す | 要る |
| apt-get install -s htop | 入れたらどうなるかを見せる。何も変えない | 要らない |
| dpkg -S /usr/bin/curl | ファイルを持つパッケージの名前を出す | 要らない |
学生が入力するセルは、このプレビューでは空白です。
もっと先へ
自分で打ってみましょう。スクリプトを、いちばん暇な日を出すように変えます。付けるか外すのは、どのオプションですか。
次に、毎週月曜の7時30分に busiest.sh を動かす cron の時刻を考えます。サーバでは、この行を /etc/cron.d に置きます。コマンドの前にユーザーを書きます。