(備忘)シェルスクリプト「私の名前は?」

まず、シェルスクリプトとはなんぞや?
UNIXで利用するCUIで、コマンドを打つと応答してくれるのがシェルの機能。
そのコマンドをテキストに羅列して一連のプログラムに仕上げたもの…といえば分かってもらえるかな?
大雑把すぎだけど。


今回は、タイトルの「シェルスクリプト内部で自分の名前を取得する方法」について。


興味ない人はまったく興味ない世界なので「続きを読む」に綴じ込み。


いつもは、大体 basename というコマンドを使う。
理由としてはログファイルとか、シェルスクリプトの名前を一部(Windowsでいう拡張子)だけ変えて使えるから。


ちなみに LinuxUNIX では、拡張子をつける義務はない。
単に人が分かりやすいというだけでファイル名につける。
OSとしての前提にファイルの権限という概念があって、そこでユーザに読み込みや書き込み、実行といったプロパティが付いている。
OSがどうやってプログラムとテキストを判断するかというと、基本的にその実行権限を見てるだけだ。
Windowsのようにファイルから特定のプログラムを実行させることが圧倒的に少ない。


それでもファイル名に .sh とつけておけばシェルスクリプトだとわかる。
.csh なら、Cシェルスクリプトとか。


僕は Bourne shellスクリプトを書く。
Linuxだと、bash かな?


閑話休題


たとえば「work.sh」というスクリプト内部で、
LogName="`basename $0 .sh`.log"
と書くと、変数 LogName に「work.log」という文字列が入る*1
work.sh から work.log という名前を生成したわけだ。


これはこれで使い勝手がいい。
でも、シェルスクリプトの名前だけが欲しい場合は、OSに用意されている変数だけで事足りる。
それが ${0##*/}


ちなみに $0 だけでもスクリプト自身の名前は表示される。
${0} と書くと、変数名を限定できる。
省略が気持ち悪いとか、スクリプトの都合上どうしても変数名と他の単語を続けて書かなければならないときとかに使う。


で、シェルスクリプトの実行時にパスを指定した場合は、ディレクトリ名も一緒に表示される。
そこからシェルスクリプト名だけを取得するのに、パターンマッチングが使われている。


しばらくこの特殊変数を使ってなかったので、どういう構文だったか検索してしまった(^_^;
備忘として記載。


あまり関係ないけど Linux のシェルで
# who am i
「私は誰」と打つと、自分のログインユーザ名を表示してくれる。
割と頻繁にユーザを切り替えるので、自分が誰だったか(どういうアカウントでログインしているか)忘れてしまうのでコマンドだったりする。

*1:変数自体は、小学校で x=1とか「代入」と習ったあの概念