【Linux】シェルスクリプトの特殊変数とその使用例(忘備録)

ITエンジニアにとってLinuxの知識は必須

フリーランスのITエンジニアとして、これまでいくつかの現場を経験してきましたが、
いずれもLinuxの知識はそれなりに求められてきました。

「それなりに」というのは、基本的なLinuxコマンドの知識であったり、シェルスクリプトを作成するのに
必要な知識というレベルです。
「OSはWindowsしか触ったことがない」という方にはハードルが高いと感じるのかもしれません。

ただ、Linuxの基本的な知識は身につけておいたほうが得だと考えています。
というのも、一度覚えてしまえばずっと使えるスキルとなるからです。
流行り廃りのあるプログラミング言語やフレームワークとは異なり、Linuxコマンドは頻繫に
変化するものでもありません。

私はインフラエンジニアを堂々と名乗れるほどのスキルはありませんし、Linuxの認定資格を
持っているわけでもありませんが、今後フリーランスに転身したいとお考えの方で、Linuxの経験は
ほとんど無いというエンジニアの方にはぜひLinuxの学習をオススメします

以下の記事で、Linux初心者向けの書籍について紹介しているので、こちらもぜひご覧ください。

なかなか腰を据えて学べないLinux 恥ずかしながら、私がLinuxを仕事で本格的に触り始めたのは40代になってからでした。...

前置きが長くなりましたが、今回は私自身の忘備録もかねて、シェルスクリプト作成する際に使える
特殊変数の解説とその使用例についてご紹介します。
全く知らないと「なんだこれは?」という感じになってしまうので、ぜひ覚えておきましょう。

覚えておくべきシェルスクリプトの特殊変数

以下に、覚えておきたいシェルスクリプトの特殊変数をご紹介します。
他にも色々あるんですが、ほんの1部だけでも覚えておいて損はないです。

$$:このシェルスクリプトのプロセスID

$#:シェルスクリプト実行時に与えられた引数の数

$0:実行したシェルスクリプト名

$n:n個目の引数(例:$1, $2..)

$?:直前に実行されたコマンドの終了ステータス(0:成功、0以外:失敗)

実際にこうやって並べてみると、大した数でもないのですが、知らない人がシェルスクリプトを解析していて、これらの変数が突然出てくると

「えっ、ナニコレ?」

となってしまうんですね。
私も初めはかなり動揺してしまいました。

変数名から何者かを推測できるものでもないので、これは覚えるしかないです。
暗記するほどではないと思いますが、$から始まるこのような変数が出てきたら
「ああ、これは特殊変数だな」と思い出して、詳細はググって記憶を呼び起こすくらいで良いのかと。

今のご時世、全てを暗記するよりも、記憶を呼び起こす程度の取っ掛かりだけでも記憶しておけば良いです。
インターネットという便利な道具があるので。

特殊変数の使い方の例を紹介

ここからは、実際にこれらの特殊変数の使用例についてご紹介します。
もちろん、ここに挙げる例以外にも使い方はあるかと思いますが、ほんの一例としてお伝えしたいと思います。

$$:出力ファイル名にプロセスIDを含める

私が経験した使い方は、シェルスクリプトから出力されるファイルの名称に含めるというものでした。
出力ファイル名が重複しないように、以下のようにファイル名に年月日時分秒ミリ秒に加えてプロセスIDを付加する、というものです。

#!/bin/bash

FILENAME1="`date '+%Y%m%d%H%M%S'`_$$.txt"

「ミリ秒まで含めておけば重複しない」なんて言う人も多いんですが、あまり過信しないほうがいいです。
確実に名称の重複を避けたいなら、プロセスIDを含めたりするのが無難でしょう。
※あくまで$$の使用例の紹介なので、重複回避の方法についてこの場でこれ以上の深追いはしません。

$#:引数の数が正しいか判定する

実行するシェルスクリプトが必要とする引数の数について、処理の冒頭でこの変数から
引数の数を取得し、想定している引数の数と同じであるかチェックする、という使い方があります。
そもそも数が不一致であれば、その時点で異常終了とします。

#!/bin/bash

#引数の数が3個以外の場合は異常終了
if [ $# -ne 3 ]; then
    echo "引数の数が正しくない"

    exit 1
fi

$0:出力ファイル名に含める

単純にシェルスクリプトの名称を返すだけの変数ではありますが、
出力するログファイル名に含めるといった使用例を目にしたことがあります。
先程のプロセスIDの使用例に、ファイル名を追加した例を以下に記します。

#!/bin/bash

#ファイル名を年月日時分秒_ファイル名_プロセスID とする
FILENAME1="`date + '%Y%m%d%H%M%S'`_$0_$$.txt"

$?:直前の実行コマンドの正常終了判定

シェルスクリプト内で実行するコマンドが正常に終了したかどうかを判定するのに使えます。
ここではファイル削除時の異常判定を行う例を挙げています。

rm samplefile.txt

if [ $? -ne 0 ]; then
    echo "ファイル削除で異常発生"
    exit 1
fi

ほんの一部ではありますが、シェルスクリプトの特殊変数について紹介してみました。
ご参考になれば幸いです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする