お兄ちゃん!
この前作った
「おみくじ」なんだけど
時々使いたくなるんだよね!
これをコマンドみたいに
簡単に実行できないかな?
cat << EOF | shuf | head -n 1
大吉
中吉
中吉
小吉
小吉
小吉
吉
吉
吉
吉
EOF
できるよ!今回は「シェルスクリプト(shell script)」を学ぼう! 以降、単に「スクリプト(script)」と呼ぶよ
おおっ!なんだか凄そうな名前だね!
最初に「対話的(interactive)」と 「非対話的(non-interactive)」を覚えよう!
今までみどりがやってきたようにシェルにコマンドを打ち込むとシェルが実行してプロンプトを返してくれるこれを「対話的」と言うんだよ
なるほど!確かにシェルと「対話」しているような 感じだったよね
一方「非対話的」と言う操作もあるんだ これは事前にやりたいことをテキストファイルにまとめてそれをシェルに解釈してもらうやり方だよ
コマンドを1つずつ入力するのではなくてあらかじめやって欲しいことをまとめて書いてそれをシェルに全部お願いするような感じ?
そうそう!例えるならレストランで注文票を渡して料理ができるまで待っているようなものだねその注文票にあたるのが「シェルスクリプト」なんだ
だから「スクリプト(script)」 つまり「台本」「手順書」などの 意味なんだね!
早速おみくじをシェルスクリプトにしてみよう!まずは
omikuji
ファイルを編集しようvim omikuji
このファイルにスクリプトを書くんだね内容はどうすればよいのかな?
内容は以下のとおりだよ
#!/bin/bash
cat << EOF | shuf | head -n 1
大吉
中吉
中吉
小吉
小吉
小吉
吉
吉
吉
吉
EOF
1行目以外は以前書いたものと同じだね!
この最初の1行目に見慣れない記述があるけど…これは何なのかな?
これは「シェバン(shebang)」という記述だよ 1行目の
#!
の後の実行ファイルで2行目以降の内容を実行するように指定しているんだ1行目は「このプログラムで実行して下さい」 と教える目印なんだ!
シェル 「シェルスクリプト」なんだね!
/bin/bash
に解釈してもらうから次にこの
omikuji
ファイルを実行可能にするよパーミッションの実行権限のことを覚えているかな?うん、覚えているよ! こうすればいいんだよね?
chmod a+x omikuji
そのとおり!実行後は
ls -l
で確認しよう!ls -l
実行権限(
x
)が付いていればいいんだね!-rwxr-xr-x 1 midori midori 104 Jan 3 19:10 omikuji
パーミッションは
rwxr-xr-x
だから…ちゃんと実行権限が付いているね!よし!早速実行しよう!
omikuji
日頃の行いが良いから「大吉」かな?
/bin/bash: omikuji: command not found
…あれ?「コマンドが見つからない」 って意味だよね?ちゃんと実行可能にしたのに?
これは
PATH
変数の問題だねPATH
変数の値はコマンドを探す場所を:
)」そうだよコマンドは
PATH
変数の値で決められた場所から探すんだ指定の場所に無いとコマンドとしては実行されないよじゃあこれからどうすればいいんだろう?
PATH
変数に含まれないディレクトリにあるスクリプトでも実行できるよスクリプトのパスを指定するんだ以下のようにしてみよう./omikuji
ええっと…「ワーキングディレクトリ」 すなわち今私がいるディレクトリだよね?
.
はそうそう!「現在のディレクトリにある omikuji」 を実行するという意味になるんだこれでスクリプトをパスで指定したことになるよ!
./omikuji
はなるほど!じゃあやってみるね!
大吉
おおっ!動いた動いた!
いいね!これでおみくじスクリプトが完成したね!
今回はシェルスクリプトを書いて実行したよ!
- スクリプトの1行目にシェバン、
2行目以降にコマンドを書く - スクリプトに実行権限を与える
./スクリプト
でスクリプトを実行する
お気に入りの操作はシェルスクリプトにしよう!ファイルだから無くなることはないよ!