LoginSignup
2
8

More than 3 years have passed since last update.

シェル(shell)を使ってプログラミングしてみる!

Posted at

みなさんこんにちわ!

みなさんはシェル(shell)って聞いたことありますか?

こちらのサイトを参考にさせてただくと、

シェルとは、UNIX / Linux でターミナルソフト (kterm など)を利用する場合、ユーザはプロンプトで操作目的のコマンドを入力し、そこで表示される結果を見てまた次のコマンド入力を行う、というサイクルで対話的な作業を行います。本当は UNIX / Linux の中核(kernel: カーネル)が管理している機能を用いて、ユーザは様々な処理を行っているのですが、カーネル自身はユーザと直接対話する能力を持っていません。そこで、ユーザと対話する能力を持ち、カーネルに対して操作のお伺いを立てる仲介役のプログラムが、ユーザとカーネルの間に存在してユーザは操作を行います。この仲介役プログラムは、ユーザから見てカーネルの周りをすっぽり覆っている「殻」(shell) のように見えることからシェルと呼ばれます(図1参照)。簡単に言えば、シェルは、ユーザが入力したコマンドを解釈してカーネルに処理を依頼し、その結果やメッセージなどを画面に表示する機能を持っているのです。

だそうです!

つまり、我々がターミナルからカーネルに指示を出す際、カーネルとの間に割って入り、カーネルがわかるように翻訳してくれる通訳のような存在のようです!

シェルについてさらっと理解したところで、早速ターミナルを使ってシェルプログラミングを行っていきましょう!

シェルにも色々種類があるようですが、最近のLinuxやMac OSなどではbashがシェルの標準環境となっていることから、bashを使います!

シェルを使ったプログラミング

シェルで実行するコマンドをまとめて一つのファイルにしたものをシェルスクリプトと言います。

利用するコマンドについては

など自分の使いたい機能を考えて調べてみてください!

シェルスクリプトの拡張子は「.sh」

サンプルシェルスクリプト(lsコマンドを実行したあとに、dateコマンドを実行、echoコマンドで文字列を出力して、readコマンドで入力結果を受け取って変数に入れて出力するスクリプト)

#!/bin/bash
ls
date
echo メッセージを入力して下さい。
read message
echo 入力されたメッセージ: $message

※最初の#!/bin/bashは「シバン」といい、このシェルスクリプトを /bin/bash にある bash シェルで実行する、という意味

  • ファイル権限 Linux の全てのファイルには、

・ファイルの所有ユーザー
・所属グループ
・その他のユーザー
の 3 つのアカウントの集団に対して、

・読み込み可能
・書き込み可能
・実行可能

という3つの権限を管理している

chmod a+x my-first.shmy-first.shは全てのユーザーが実行可能なようにファイル権限を変更

  • シェルスクリプトの実行 必ず./をつけた相対パスで実行する必要がある→つけないとエラーmy-first.sh: command not foundが発生 ↓ 相対パスを指定しないとコマンドだと認識されるから、「そんなコマンドは存在しないよ!」と怒られる

実行結果

$ ./my-first.sh

my-first.sh
2018年  3月 29日 木曜日 08:13:52 UTC
メッセージを入力して下さい。
入力されたメッセージ: hoge

readコマンドで第一引数の変数に対して、入力された文字列を代入し、echoコマンドで$をつけて変数を指定することで、入力内容を表示

  • シェルスクリプトでのif文
#!/bin/bash
read -p "日本で二番目に高い山は槍ヶ岳でしょうか? [y/n]" yn
if [ $yn = "n" ]; then
    echo 正解です。日本で二番目に高い山は北岳です。
else
    echo 不正解です。日本で二番目に高い山は北岳です。
fi

readコマンドは、-p"表示したい文字列"というオプションをつけることで、 文字を表示しながら入力を変数に受け取ることができる

if文はif [ $yn = "n" ]; thenのように、条件は[]内に記入してスペースをつけて、最後はコロンとthenをつける。またif文の終わりにはfiの記載が必要

  • シェルスクリプトでのwhile句

while :; doからdoneまでを、終了メッセージを受け取るまでループ

例:while :; do (echo "Thank you for your access!") | nc -l 8000 ; done

→8000というポートを使ってサーバーとして起動し、アクセスがあったら、標準出力の内容を返して終了する

echoコマンドでの標準出力を|(パイプ)を使ってncコマンドに渡している

ncコマンド:NetCatの略。 TCPやUDPの読み書きを行うコマンドで、Webサーバーからの情報の取得や、簡易Webサーバーの設置、メールの送信などさまざまな機能がある

ポート:TCPやUDP の通信の取り決めのひとつ。0番から65535番のいずれかの数値を設定して通信を行う。通信をするためには、必ず何かしらのポートを利用しなくてはならず、プロトコルやソフトウェアによって、このポートが決まっているものもたくさんある

2
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
8