Linuxシェルスクリプト入門:変数の基本を徹底解説(第9回)
これまでLinuxシェルスクリプティングに関する連載記事をお届けしてきましたが、当時は多くの方にご好評いただき、今でも十分に役立つ内容となっています。ここでは、変数の仕組み、実行方法、そしてシェルスクリプトでの実装について詳しく見ていきます。
コマンド出力の保存
コマンドの出力は標準出力やファイルにリダイレクトできるだけでなく、変数に格納することも可能です。コマンドの出力が大きすぎて画面に収まらない場合は、ファイルまたは変数に出力を保存するしかありません。変数に出力を保存する利点の一つは、確認速度が速いことです。変数はメモリ上に保存されるため、ファイルからの読み出しと比べて高速に処理されます。
シェルスクリプトにおける変数
変数はシェルスクリプティングにおいて重要な構成要素であり、bashのコマンド「declare」を使って宣言します。例えば「LEVEL」という変数を宣言するには、以下のコマンドを実行します。
$ declare LEVEL
注意:Kornシェルとの互換性を保つためには、組み込みステートメントである「typecast」を使用する必要があります。ただし「declare」はより高度で全ての機能を備えているため、BASHを使用する場合は「declare」の利用が推奨されます。
変数命名のルール
- 変数名は、スクリプト内でのその変数の用途に合ったものにする。
- プログラム全体で同じ変数名を使い続けることが強く推奨される。
- 変数名は大文字でも小文字でも構いませんが、慣習としてシェルコマンドは小文字で記述されるため、混同を避けるために変数名は大文字にするのが望ましい。例:TOTAL_BILLED_AMOUNT、SELL_REPORT、ORDER_RECEIPTなど。
変数の実装
変数には等号(=)を使って値を代入できます。空の文字列を代入する場合は、等号の後に何も指定しません。
$ LEVEL=
変数「LEVEL」に格納された値は、次のようにして確認できます。
$ printf "%i" $LEVEL
printfは、多くの「C言語」プログラマーがよく知っているコマンドで、データを出力します。%iは整数を表します。必要に応じて、文字の場合は%c、文字列の場合は%sに置き換えることもできます。
$LEVEL のように変数名の前に付く「$」は、変数「LEVEL」の値を参照するための記号です。
実行例
$ printf "%i" $LEVEL 0
変数に値を代入してみましょう。
$ LEVEL=0
格納されたデータを確認します。
$ printf "%i" $LEVEL 0
注目ポイント:興味深いことに、値を代入しなかった場合と、「0」を代入した場合の両方で、出力は同じく0になります。しかし、出力結果が同じでも、シェルスクリプトはこの2つの変数宣言を異なるものとして扱います。
さらに新しい値を代入してみます。
$ LEVEL=121
$ printf "%i" $LEVEL 121
変数の削除(unset)
declareはBASHのコマンドであり、実行されたときにのみ変数を作成します。作成された変数は、スクリプトが終了するか、明示的に破棄されるまでメモリ上に保持され続けます。
$ unset LEVEL
BASHの定義済み変数
BASHには50以上の変数があらかじめ定義されています。これらの一部はBASHにとって特別な意味を持っています。例えば変数RANDOMはランダムな数値を出力します。もしunsetして再度定義すると、元の変数の値は永久に失われます。そのため、システムが定義している変数は使用しないことをお勧めします。
以下に、便利なBASH変数の一部を紹介します。
- BASH — Bashの完全なパス名。
- BASH_ENV — シェルスクリプト内で、スクリプト開始前に実行されるプロファイルファイルの名前。
- BASH_VERSION — Bashのバージョン(例:2.04.0(1)-release)。
- COLUMNS — ディスプレイ上の1行あたりの文字数(例:80)。
- HOSTNAME — コンピュータの名前。Linuxのバージョンによってはマシン名だったり、完全修飾ドメイン名だったりします。
- HOSTTYPE — コンピュータの種類。
- HOME — ホームディレクトリの名前。
- OSTYPE — オペレーティングシステムの名前。
- PATH — 実行するコマンドを探すためのコロン区切りの検索パスのリスト。
- PPID — シェルの親プロセスのプロセスID。
- PROMPT_COMMAND — PS1プライマリプロンプト文字列が設定される前に実行されるコマンド。
- PWD — 現在の作業ディレクトリ(cdコマンドによって設定される)。
- RANDOM — 参照されるたびに0から32767の間の乱数を返す。
- SHELL — 使用すべき優先シェル。シェルを起動するプログラム向け。
- TERM — ターミナルエミュレーションの種類(例:console)。
ワード分割のルール
$ LEVEL=0 $ printf "%i" $LEVEL 0 および $ LEVEL="0" $ printf "%i" $LEVEL 0
どちらの場合も出力は同じです。では、クォートを使用することで何が違うのでしょうか?
別のデータで同じことを試してみましょう。
$ LEVEL=0 ; 1 ; 2 ; 3 ; 4 ; 5 bash: 1: command not found bash: 2: command not found bash: 3: command not found bash: 4: command not found bash: 5: command not found
$ printf "%i" $LEVEL 0
言うまでもなく、出力は正しくありません。BASHは「0」の後のスペースを終端として解釈するため、変数の値は「0」だけが設定されてしまいました。次に、変数にクォートを使ってみます。
$ LEVEL="0 ; 1 ; 2 ; 3 ; 4 ; 5" $ printf "%s" $LEVEL 0;1;2;3;4;5
それでも結果は正しくありません。BASHは変数の値を受け取り、間にあるすべてのスペースを削除しました。そのため、printfは0、1、2、3、4、5を別々の値として解釈できませんでした。では、解決策は何でしょうか?
printf "%s" "$LEVEL" 0 ; 1 ; 2 ; 3 ; 4 ; 5
そうです! 変数展開をダブルクォートで囲むのが解決策です。クォートはシェル内で文字をグループ化し、特殊文字を意味のある形で解釈します。
クォートは連続して使うこともでき、変数展開をクォートで囲むのは良い習慣です。さらに、テキスト全体と引用部分を分離するためにも使用できます。以下に例を示します。
$ LEVEL=5 $ FLAG_MESSAGE="I HAVE CLEARED LEVEL""$LEVEL"". I Deserve appreciation." $ printf "%s" "$FLAG_MESSAGE"
"I HAVE CLEARED LEVEL5. I Deserve appreciation."
引用されたテキストの塊をスペースで区切ると、先ほど説明したのと同じ問題が発生します。bashは空白を終端として扱うからです。もう一つの変数展開の方法もあります。
$ LEVEL=5
$ FLAG_MESSAGE="I HAVE CLEARED LEVEL ${LEVEL}. I Deserve appreciation."
$ printf "%s" "$FLAG_MESSAGE"
"I HAVE CLEARED LEVEL 5. I Deserve appreciation."
シングルクォートは、BASHが特殊文字を出力するのを防ぎます。
$ printf "%s" '$FLAG_MESSAGE' "$FLAG_MESSAGE"
バックスラッシュ(\)
バックスラッシュは、1文字に対するシングルクォートのように機能します。「"」という文字自体を出力したい場合どうすればよいか考えたことはありますか?
$ printf "%c" "\""
%qをprintfと組み合わせると、各単語の後にバックスラッシュが付加され、単語間のスペースが保証されます。
$ LEVEL=5
$ FLAG_MESSAGE="I HAVE CLEARED LEVEL ${LEVEL}. I Deserve appreciation."
$ printf "%q" "$FLAG_MESSAGE"
"I\ HAVE\ CLEARED\ LEVEL\ 5.\ I\ Deserve\ appreciation."
まとめ
今回はここまでです。私たちは常に、読者の皆様にとって役立つ記事をお届けできるよう努めています。今回取り上げた内容は非常に広範であるため、「変数の属性」、「変数のエクスポート」などの残りのトピックについては、具体例とともに次回の記事で紹介する予定です。
それまで、ぜひTecmint.comからの最新情報をお見逃しなく。下のコメント欄で貴重なフィードバックをお寄せいただくのもお忘れなく!
-
Linux Bashのネストした変数置換とevalコマンド、事前定義変数一覧 – パート11
これまでのBashシェルに関する記事、特に変数について詳しく解説した2本の記事は、読者の皆様から高い評価をいただきました。Tecmintチームとしては、最新かつ関連性の高いトピックを詳細に提供することを心がけており、常に各テーマの重要な観点にも触れるよう努めています。今回の記事はLinux変数シリーズの最終回です。変数の置換(Variable Substitution)と、シェルにあらかじめ定義されている変数について解説し、このテーマを締めくくりましょう。Bashにおける変数置換の仕組みBashは、コマンドが実際に実行される前に変数の置換を行います。Bashシェルはコマンド実行前にすべての「$
-
【保存版】シェルスクリプトでLinux変数を完全理解する方法 – declareコマンド徹底活用(パート10)
Linuxのシェルスクリプト言語は、昔から根強い人気を誇るテーマであり、今後もずっと注目され続けるでしょう。シェルスクリプトはまるで魔法のように、他のプログラミング言語と同等の手軽さでプログラムを作成できます。ただし、自分が何を行っているのか、どんな結果が期待できるのかを深く理解しておくことが重要です。 これまでお届けしてきたシェルスクリプト入門シリーズは、前回の「Linux変数の徹底解説」を含め、多くの読者様から高い評価をいただいています。本記事では、その内容をさらに一歩深掘りしていきます。 変数の属性とは Linux環境のそれぞれの変数には固有のオプションが存在し、これらは「属性」と呼ば