(Linuxの基本6)シェルスクリプトを掘り下げる(Bashを中心に)

シェルスクリプトの作成概略は既に記載したが、もう少し掘り下げておさらいしてみようというのがここの課題。

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

ここに表示できないほど見にくいファイルの一覧が表示された。こんなの実用的でないが、一応コマンドが実行できた。

コメント

タイトルとURLをコピーしました