シェルスクリプトの作成概略は既に記載したが、もう少し掘り下げておさらいしてみようというのがここの課題。
1.スクリプトの実行
例
$ nano ~/hello.sh
#!/usr/bin/bash ← インタープリタ(実行するプログラム)の指定
# 2行目移行の # はコメント
echo " こんにちは 日本"
ls
pwd
こんなファイルを実行するには
□1の方法==>> $ bash ~/hello.sh ← bash + ファイル名
□ 2の方法==>> $ source ~/hello.sh ← source + ファイル名
□ 3の方法==>> $ . ~/hello.sh ← . + ファイル名
□ 4の方法 ==>> $ chmod +x ~/hello.sh
そのうえで、
$ ~/hello.sh ← 実行権限を付与して、直接ファイル名で
こんなに方法があったとは今更ながら驚。最初から実行権限さえ与えておけば4の方法が一番タイプが少なくて済む。やっぱりこれがお薦め?
(1)インタプリタを指定することを「シバン(shebang)」と呼ぶらしいが、こんなフルパスでなくてもと思った。なぜなら環境変数で /usr/bin まではBashを呼び出すことが可能になっているはずだからだ。
それで、
$ nano ~/hello.sh
#!bash ← フルパスから修正
# sample script
echo "こんにちは 日本"
ls
pwd
として、実行してみたら、案の定、正常に機能した。
(2)シバンの行は、1〜3の方法で実行した場合と、4の方法で実行した場合とでは機能が異なっているらしい。
1〜3の方法で実行した場合は、シバンは単なるコメント行として扱われているらしい。これらの場合は、bashやsourceがスクリプトを解釈するらしい。だからシバン行は記述しなくても構わない。それでは4の方法では、シバン行が不可欠ということか
いや、なくても機能した。
シバンがあるとカーネルはそのシバンで指定したインタープリタを起動し、シバンに続くスクリプトを解釈、実行する仕組みになっているが、なければないで、既定のシェルBashが起動されて、テキストファイルを実行しているそうだ。
結論として、
「それじゃ、もう無くてもいいんだ。既定のシェルBash以外のインタープリタだから!
でも、例えば、python を使うときには
#!/usr/bin/python と明示が不可欠。」
2.変数
(1)特殊な変数
変数 | 機能 |
$0 | シェルスクリプトの名前またはシェルスクリプトを実行したプロセス名 |
$$ | 実行しているシェルのプロセスID |
$i | 最後にバックグラウンドで実行したコマンドのプロセスID |
$? | 最後に実行したコマンドの終了ステータス |
$ echo $$ ← 実行しているプロセスID
31911
$ ps コマンドで確認
PID TTY TIME CMD
1106 pts/0 00:00:00 less
15094 pts/0 00:00:00 ps
31911 pts/0 00:00:00 bash ← bashプロセスID
(2)シェルスクリプトに与えた引数を参照できる変数
今度は引数を表示します。
$数値または{整数値} | 指定した数値番目の引数の値 |
$# | 引数の数 |
#? | すべての引数を空白区切りで表示 |
$ nano ~/variable.sh
#!/usr/bin/bash
echo $1 ← 一番目の引数を表示
echo ${2} ← 二番目の引数を表示
echo $# ← 引数の数を表示
echo $@ ← すべての引数を空白区切りで表示
$ bash ~/variable.sh りんご みかん
りんご
みかん
2
りんご みかん
$ nano ~/quot.sh
#!/usr/bin/bash
test1 = "りんご" ← test1にを代入
test2 = "apple" ← test2に代入
echo "$test1" ← 変数をダブルクォーテーションマークで囲んだ場合
echo "$test2" ← 同上
echo '$test1' ← 変数をシングルクォーテーションマークで囲んだ場合
echo '$test2' ← 同上
$ bash ~/quot.sh
エラーが出た。何回か修正している間に2種類のエラーが出た。
: unary operator expected
: command not found
参考:http://karoten512.hatenablog.com/entry/2018/01/19/002558
どうも test1(2) の後ろと=との間の半角スペース、=と””との間のスペースが原因のようだ。
test1=”りんご”
test2=”apple”と、すべてのスペースをなくして実行したら以下の表示となった。
りんご
apple
$test1
$test2
めでたし!ではなく、ここで覚えるのは””(ダブルクォーテーションマーク)で囲んだ変数は変数値を取り出すことができるが、’’(シングルクォーテーションマーク)で囲むと単に文字列に取り扱われるということ。
`(バッククォーテーション。日本語キーボードでは SHIFT+@)で囲まれた文字列はコマンドとして解釈実行されます。
$ nano ~/backquot.sh
#!/usr/bin/bash
LS_TEST=`ls -al`
echo $LS_TEST
$ bash ~/backquot.sh
ここに表示できないほど見にくいファイルの一覧が表示された。こんなの実用的でないが、一応コマンドが実行できた。
コメント