##概要
”ファイルを圧縮して、名前を変更して、不要ファイルを削除して、そのコピーを作成する"
みたいな繰り返し行われる処理の一連のコマンドを自動化するためのものを、シェルスクリプトという。
ここでやっとプログラミング要素が出てくる。
条件分岐や繰り返しなどを用いて処理を実行する。
##実行環境
- macOS BigSur 11.4
- CentOS7 (macOS上でLinux環境を構築する方法はこちらを参考にしました)
##1. プログラムを構成する要素
- 順次実行
- 条件分岐(if, else)
- 繰り返し(while, for)
- サブルーチン(関数)
##2. シェルスクリプトの基本
例として、”カレントディレクトリにtest
というファイルを作成し、その詳細情報を表示させる”test_script.sh
という名前のシェルスクリプトを作成する。
#!/bin/bash (利用するシェルの種類とそのコマンド位置を記述、シェルスクリプトのお約束みたいなもの?(C言語のint main(void){}みたいな))
# '#'以降にコメントを書くことができる。コメントは処理に作用しない。
touch test #(ファイルの作成)
ls -l test #(ファイルの詳細情報表示)
作成したシェルスクリプトを実行する。
chmodコマンドで実行権限を与える。
$ chmod u+x test.sh
そして、以下のように実行する。(./はパス指定)
$ ./test.sh
-rw-r--r-- ... test
##3. 変数
####基本的な変数の宣言方法
変数への代入は'='を用いる
$ index=1
配列は[]を使って表現する
$ nbr[0]=123
$ nbr[1]=456
変数の参照は`$`を用い、配列変数の場合は`${}`とする
$ echo ${nbr[$index]}
456
####シェル変数と環境変数
- シェル変数 : 実行しているシェル内のみ有効な変数
- 環境変数 : そこ以降に実行されたコマンド内でも有効な変数
例) 二つの変数の違いを標準出力で確認する。
#!/bin/bash
export x=123
y=456
echo x=$x in test1.sh
echo y=$y in test1.sh
./test2.sh
#!/bin/bash
echo x=$x in test2.sh
echo y=$y in test2.sh
実行結果
$ ./test1.sh
x=123 in test1.sh
y=456 in test1.sh
x=123 in test2.sh (環境変数:x は引き継がれている)
y= in test2.sh (シェル変数:y は引き継がれない)
####変数を扱うコマンド集
定義した変数を一覧表示したり、標準入力から読み取ったデータを書き込んだりできる便利なコマンドをいくつかメモしておく。
$ read [variable_name]
変数に標準入力から読み取ったデータを書き込む。既にある場合は上書きされる。
$ set, unset [variable_name]
シェル変数の一覧表示と、削除を行うコマンド
$ env, unset [variable_name]
環境変数の一覧表示と、削除を行うコマンド
####引用符
文字列を引用符と呼ばれる記号で囲むと特殊な振る舞いをする。
その種類をメモしておく。
- ' '(シングルクォーテーション) : 文字列として認識される、変数参照の$も文字列となる。
- " "(ダブルクォーテーション) : 変数参照$も認識する文字列
- ` `(バッククォーテーション) : 文字列をコマンドとして認識する
##4. 引数
####引数の扱いの基本
シェルスクリプトを実行する際に、実行コマンド名に続いて指定される値を引数という。
$
の後に続く文字で引数を指定する。
-
$1, $2, ..., $n
: n番目の引数の値 -
$0
: 実行コマンド名 -
$#
: 引数の数
例)
$ ./args.sh aaa bbb ccc
$1: aaa
$0: ./args.sh
$#: 3
####shift文
引数の順序をずらすコマンド。
shiftを実行すると、$2->$1, $3->$2, ...
となる。
これは、どこで使うんだろうシリーズ。
##5. エスケープシーケンス
\
を用いるとその直後1文字の扱いを変更できる。
””
や''
などの引用符を表示したい時や、改行を入れたい時などに使用すると良い。
例)
$ echo "I am a cat. \
> As yet I have no name." (コマンドの途中で改行を入れても大丈夫になる)
I am a cat. As yet I have no name.
\n
(改行)、\t
(タブ)など特別な意味を持つ組み合わせもある。
##6. sourceコマンド
指定されたファイルを読みこんで、シェル環境を設定するコマンド。
.zshrc
.bash_profile
などシェル環境設定ファイルの設定を変更後、シェルにログインし直さずに設定を現在のシェル上に反映する際によく使われる。
aliasの設定とかした時にめっちゃ便利。
例)
$ vi ~/.zshrc
alias ..="cd .." (.zshrcを編集して、aliasを設定する)
$ source ~/.zshrc (変更した設定を反映)
$ .. (一つ上の階層に移動するaliasが設定できた)
##終わりに
今回は、シェルスクリプトについて簡単にまとめました。
エスケープシーケンスや引用符は、今回メモした以外にも様々な使い方があるため、調べておきます。
また、条件分岐や繰り返し、サブルーチンといった部分は次回書きたいと思います。
##参考文献
この記事は以下の情報を参考にして執筆しました。