未経験からのフルスタックエンジニア

スキルをつけよう!未経験からフリーランスエンジニアへの成長記録

Linux学習履歴(7)~シェルスクリプト・シェルの環境設定~

以下の記事の続きです

atora1992.hatenablog.com

Linuxコマンドライン入門』が日ごとに6日間分別れているので、今回は6日目の中間地点から最後までの内容についてです。

コマンドの備忘録的になってしまうと思いますので、悪しからず。

6日目

シェルスクリプト

シェルスクリプトの前に

シェルは、ユーザーが入力したコマンドを解釈してカーネルに伝えるコマンドインタプリタであると同時に、プログラミング言語でもあります。

つまり、例えばfor文による繰り返し処理も可能です。

for 【変数】 in 【値のリスト】
do
 【コマンド】
done

【値のリスト】から値を一つずつ取り出し【変数】に入れ、各変数に対する処理を【コマンド】に書きます。以下の例では、"Red Black White"という値のリストのそれぞれを表示しています。

$ for color in Red Black White
> do
> echo $fruit
> done
Red
Black
White

for文を用いれば、拡張子を変更することもできます。
そのために、パターン照合演算子と呼ばれる機能を使います。

${変数%パターン}:変数の最後とパターンが一致した場合、一致する最短部分を削除して残りを戻す
${変数%%パターン}:変数の最後とパターンが一致した場合、一致する最長部分を削除して残りを戻す
${変数#パターン}:変数の最初とパターンが一致した場合、一致する最短部分を削除して残りを戻す
${変数##パターン}:変数の最初とパターンが一致した場合、一致する最長部分を削除して残りを戻す

例えば、以下のように、拡張子を削除することが可能です。

$ file="index.htm"
$ echo ${file%.htm}
→ index

$ echo ${file%.*}
→ index

この機能を用いれば一括拡張子変換が可能です。

$ ls
global.html index.html orange.htm sample.htm   #.htmlと.htmが混在

$ for file in *.htm  #拡張子が.htmのファイルのみ取り出す
> do
> mv $file ${file%.*}.html  #拡張子を削除し、.htmlをつける
> done

$ ls
global.html index.html orange.html sample.html

シェルスクリプト

シェルのコマンドで記述したプログラムのことをシェルスクリプトといいます。
コマンドを羅列したファイルを作成し、後から呼び出す形で使用します。ただし、このファイルの先頭には、次の形式でスクリプトを実行するプログラムの絶対パスを記述する必要があります。

#!【プログラムの絶対パス】

bashは通常「/bin」ディレクトリに保存されています。これを考慮して、先ほどの拡張子変換をシェルスクリプトにしてみます。

#!~/bin
for file in *.htm
do
 mv $file ${file%.*}.html
done

続いて、コマンドを実行できるように、chmodで実行権限を与えます。

$ chmod a+x ~/bin/htmToHtml

(権限については以下の記事を参考にしてください)

atora1992.hatenablog.com

シェルスクリプトを実行するには、ファイルを呼び出せばOKです。

$ ~/bin/htmToHtml

$ htmToHtml
※大抵の場合は、~/binディレクトリにおいたコマンドは、コマンド名だけで実行できます

作成したコマンドは以下のどちらかに保存するのが通常です。

  • /usr/local/bin:全てのユーザーが使うコマンド
  • ~/bin:自分だけで使用するコマンド

シェルの環境設定

組み込みシェル変数

シェルの動作を制御したり、シェルの情報を格納している変数のことです。
現在設定されているシェル変数はsetコマンドで確認できます。

$ set

さらに、oオプションをつけて実行すれば、シェルのコマンドラインの動作に関する設定オプションを確認できます。

$ set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
....

「on」が有効になっているオプション、「off」が無効になっているオプションです。

オプションの有効・無効は以下のコマンドで切り替え可能です。

$ set -o【オプション名】  #有効化
$ set +o【オプション名】  #無効化

有効なオプションのみ取り出すことも可能です。

$ set -o | grep "on$"

環境変数

シェル変数は、シェルの中だけで有効な変数です。つまり、シェルから起動したプログラムはシェル変数を参照しません。

一方で、シェルから起動したプログラムにも引き継がれていく変数のことを環境変数と呼びます。

環境変数を設定・削除するにはexportコマンドunsetコマンドを用います。

$ export【変数名】=【値】

#あらかじめ設定済みの通常のシェル変数を環境変数にする
$ export【変数名】

$ unset【変数名】  #環境変数を削除

環境変数から値を取り出す方法は、シェル変数と同じく"$"を変数名の前につけます。

現在、どのような環境変数が設定されているかはprintenvコマンドで確認できます。

$ printenv

環境変数を常に変更しなくとも、コマンド実行の間だけ環境変数を変更するには envコマンドを使用します。

$ env【変数名】=【値】 【実行するコマンド】

エイリアス

コマンドを別の名前で呼び出す機能をエイリアスと呼びます。
エイリアスの設定にはaliasコマンドを用います。

$ alias【エイリアス名】=【コマンド名】

コマンドにはパイプを用いた複数のコマンドを定義することもできます(コマンド全体をクォーテーションで囲みます)

$ alias findgrep='find . -type f -name "*.txt" -print0 | xargs -0 grep'

$ findgrep Atora  #文字列「Atora」を含むファイルを探す

設定されているエイリアン一覧の確認には、引数なしでaliasコマンドを実行します。

$ alias

エイリアスの定義を削除するには、unaliasコマンドを用います。

$ unalias【エイリアス名】

シェルの環境設定ファイル

環境設定ファイルに記述しておくことで、ログイン時にシェル変数・環境変数エイリアスなどの定義を自動的に設定することが可能です。

環境変数は「~/.bash_profile(初期状態ではないので自分で作成する)」に、それ以外は、「~/.bashrc(初期状態ではないので自分で作成する)」に記述するのが基本のようです。

前者は、最初のログイン時に1回だけ読み込まれます。一方で、後者はターミナルを開くたびに読み込まれます。

上記ファイルを変更した場合には、ログインし直さなくとも以下のコマンドで設定を反映させることが可能です。

$ source ~/.bashrc
$ source ~/.bash_profile