Lから始まるLinux

2章39話
プロセス優先度
2章40話 シェル変数
もくじ
2章41話
コマンド置換
シェル変数
若木 しげる
今回は 「シェル変数(shell variable)」を学ぼう データの「入れ物」みたいなものなんだ 以降、単に「変数(variable)」と呼ぶよ
若木 みどり
データの入れ物? どうやって 使うのかな?
シェル変数の定義
若木 しげる
まずは変数の定義からだよ 以下のようにして定義するんだ
変数名=値
若木 しげる
ただし = の両脇にはスペースを入れないでね
若木 みどり(笑顔)
定義は簡単だね迷うことはなさそう!
若木 しげる
では実際に試してみよう
若木 しげる
TIMER という変数にタイマーの秒数を保持させよう
若木 しげる
30秒タイマーにしたければ以下のようにするよ
TIMER=30
若木 みどり
わかった!
若木 みどり
…打ち込んだけど特に何も起こらないね
若木 しげる
変数を設定しても何も表示されないんだだけどシェルは変数の値を覚えてくれているよ
シェル変数の参照
若木 しげる
今度は変数の値を呼び出してみよう以下のように記述するよ
$変数名
若木 みどり
これで変数の値を取り出せるのね!
若木 しげる
それを確かめるために以下のコマンドを打ち込んでみよう
sleep $TIMER; tput bel
若木 みどり
「セミコロン(;)」は…1行で複数のコマンドを書く書き方だったよね
若木 しげる
そして tput bel「ベルを鳴らす」だね
若木 みどり
TIMER 変数に入っていた 30 が使われてsleep 30 を実行してくれるんだね
若木 みどり(笑顔)
30秒待った後にベルが鳴る…確かに30秒タイマーとして機能するね!
若木 しげる
じゃあ今度は TIMER 変数の値を変えてみよう3分タイマーにしたければ以下のようにしてみてね
TIMER=180
若木 みどり
3分は180秒というわけだね設定したよ!
若木 しげる
そうしたら同じコマンドを再び実行してみよう
sleep $TIMER; tput bel
-- 3分後 --
若木 みどり(驚き)
本当だ!3分待機してからベルが鳴った!
若木 みどり
実行するコマンドは同じなのにTIMER 変数の値を変えるだけで動きが変わるんだね
若木 しげる
変数を使うと「変化する値」簡単に操作できるようになるんだ
予め用意されている変数
若木 しげる
シェルには初めから用意されている変数もあるんだいくつか重要なものを紹介するね
変数名変数の値
PATHコマンドを探すディレクトリのパス。複数のパスをコロン区切りで指定している
HOMEユーザのホームディレクトリのパス
PWDワーキングディレクトリのパス
USER現在ログインしているユーザ名
SHELL現在使っているシェルの実行ファイルのパス
IFSシェルが区切り文字として使う文字
若木 みどり
こういう変数は勝手に定義されるんだね!
変数名に使える文字
若木 しげる
自分で宣言する変数の変数名に使える文字には制限があるよ英大文字小文字数字とアンダースコア(_)が使えるんだただし1文字目には英数字は使えないよ
若木 みどり
制限はあるけど自由な名前をつけるには十分そうだね
若木 しげる
これは変数の値を文字の中に埋め込みたい場合に困る場合があるんだ
若木 みどり
へぇ…どういう場合かな?
若木 しげる
例えば ユーザ名_id_rsa というファイル名を扱いたい場合はどうすればいいと思う?
若木 みどり
こうすればいいんじゃないのかな?
$USER_id_rsa
若木 しげる
実はこの指定だと意図どおりに動かないんだ$ 以降が全て変数で使える文字なのでこれは USER_id_rsa 変数だと判断されるよ
若木 みどり(驚き)
なるほど…それは困っちゃうね
若木 しげる
それを避けるために以下のような記述でも変数を呼び出せるんだ
${変数名}
若木 しげる
さっきの例だと以下のようにすれば意図どおりに動くよ
${USER}_id_rsa
若木 みどり
普段はそのままでいいけど変数名の区切りで困ることがあれば${変数名} とすればいいのね!
まとめ
若木 みどり
今回は「シェル変数」その使い方について学んだよ!
若木 しげる
シェル変数を使うことでコマンドを柔軟にしたり抽象的に扱えたりするんだ高度な操作に必要な機能なので使えるようにしておこう!