【保存版】シェルスクリプトでLinux変数を完全理解する方法 – declareコマンド徹底活用(パート10)
Linuxのシェルスクリプト言語は、昔から根強い人気を誇るテーマであり、今後もずっと注目され続けるでしょう。シェルスクリプトはまるで魔法のように、他のプログラミング言語と同等の手軽さでプログラムを作成できます。ただし、自分が何を行っているのか、どんな結果が期待できるのかを深く理解しておくことが重要です。
これまでお届けしてきたシェルスクリプト入門シリーズは、前回の「Linux変数の徹底解説」を含め、多くの読者様から高い評価をいただいています。本記事では、その内容をさらに一歩深掘りしていきます。
変数の属性とは
Linux環境のそれぞれの変数には固有のオプションが存在し、これらは「属性」と呼ばれます。属性は、状況に応じて「declare」コマンドを使ってオン/オフを切り替えることができます。
属性の一例が「-i」スイッチです。これを指定すると、対象の変数に整数(integer)属性が設定されます。仮に「-i」付きの変数へ非数値を代入しても、エラーは発生せず、整数として解釈された結果「0」が出力されます。具体的に見てみましょう。
まず、整数変数 bill = 121 を宣言します。
admin@wsxdn.com:~$ declare -i bill=121
変数 bill の値を printf で出力します。
admin@wsxdn.com:~$ printf "%d\n" "$bill" 121
続いて、値を文字列に変更してみます。bill はすでに宣言済みなので、改めて宣言し直す必要はありません。値だけを上書きしましょう。
admin@wsxdn.com:~$ bill=tecmint
もう一度、変数 bill の値を出力します。
admin@wsxdn.com:~$ printf "%d\n" "$bill" 0
エラーメッセージの代わりに「0」が表示される点に注目してください。
宣言済み変数の属性を調べるには?
ここで疑問が生じます。「すでに宣言された変数の属性は、どうやって確認すればいいのだろう?」そんなときに活躍するのが「-p」(printの略)スイッチです。
admin@wsxdn.com:~$ declare -p bill declare -i bill="121"
変数の属性をオフにするには?
逆に、変数の属性をオフにしたい場合は、スイッチの手前に「+」(プラス)記号を付けるだけでOKです。以下の例で確認してみましょう。
先ほどの変数から整数属性を解除します。
admin@wsxdn.com:~$ declare +i bill
変数の値を確認してみます。
admin@wsxdn.com:~$ printf "%d\n" "$bill" bash: printf: bill: invalid number 0
今度は文字列として(%s)値を出力してみましょう。
admin@wsxdn.com:~$ printf "%s\n" "$bill" tecmint
この例から分かるように、bash自体は非数値をエラーとは判定しませんが、printf側が「何が数値で、何が数値ではないか」を解釈しているのです。
読み取り専用変数とは
「読み取り専用メモリ(ROM)」という言葉はよく耳にすると思いますが、「読み取り専用変数」とは何でしょうか?ROMと何か共通点があるのでしょうか?
実は、読み取り専用変数はROMと同じように、一度値を代入すると二度と変更できない変数のことです。だからこそ「読み取り専用(Read-only)」と呼ばれます。書き込みも編集も、新しい値の代入も一切できません。例で確認してみましょう。
読み取り専用(-r)変数 name を宣言し、"Tecmint.com" という値を設定します。
admin@wsxdn.com:~$ declare -r name="Tecmint.com"
宣言した変数の値を出力します。
admin@wsxdn.com:~$ printf "%s\n" "$name" Tecmint.com
次に、値を変更しようとしてみます。
admin@wsxdn.com:~$ declare -r name="Avishek" bash: declare: name: readonly variable
このように、読み取り専用変数への再代入は拒否されます。なお、前述のとおり属性自体は「+」記号を使えば解除できます。
Linuxにおける変数のエクスポート
シェルスクリプト内で宣言された変数は、スクリプトが動作している間だけ有効です。スクリプトの外では、その変数は存在しないことになっています。変数をスクリプトの外側でも利用可能にすることを「変数のエクスポート」と呼びます。
変数をシェルの外部へエクスポートするには、「declare -x」(export)スイッチを使用します。これにより、シェルに対して「この変数をエクスポートしたい」と伝えることができます。
admin@wsxdn.com:~$ declare -x variable="Constant_Value"
ここで重要な注意点があります。スクリプト実行中に変数へ加えた変更はすべて、エクスポートされた時点で失われるというルールです。変数のエクスポートはシェルスクリプトにおいて非常に重要な概念なので、しっかり押さえておきましょう。
「読み取り専用かつ、スクリプト外でも利用できる変数」が必要な場合は、「-r」と「-x」の両方のスイッチを同時に指定します。
admin@wsxdn.com:~$ declare -rx variable="Constant_Value"
環境変数とは
環境変数とは、プログラムと、それを呼び出す側のプログラムとの間で共有される変数のことです。環境変数はエクスポートできますが、属性を設定することはできません。
それでは、この理論を実際に確かめてみましょう。ここに 0.sh と 1.sh という2つのスクリプトを用意します。
# 0.sh #!/bin/bash declare -rx name=Tecmint bash 1.sh exit 0
続いて、2つ目のスクリプトです。
# 1.sh #!/bin/bash printf "%s\n" "$name" name=Tecmint.com printf "%s\n" "$name" exit 0
ここで起きていることを整理すると、変数 name を読み取り専用かつエクスポート可能として宣言した直後に、2つ目のスクリプトを呼び出しています。
2つ目のスクリプトでは、最初の printf 文で、1つ目のスクリプトからエクスポートされた変数の値が出力されます。一方、2番目の printf 文では、変数「name」に新しく代入された値が表示されます。
「変数は読み取り専用のはずなのに、なぜ再代入できるのか?」と不思議に思うかもしれません。思い出してください。「スクリプト実行中に変数へ加えた変更は、スクリプト外へエクスポートされた時点ですべて失われる」というルールを。エクスポート後の変数は、元のスクリプト内の読み取り専用属性とは切り離されて扱われるのです。
declareコマンドで使える主なオプション一覧
declare コマンドでは、以下のスイッチおよびその組み合わせを利用できます。
- -a:配列として変数を宣言する。
- -f:関数名とその定義を表示する。
- -F:関数名のみを表示する。
- -r:変数を読み取り専用として宣言する。
- -x:変数をエクスポート可能として宣言する。
- -i:変数を整数として宣言する。
いかがでしたか?次回の記事では、「eval」コマンドを使った変数の置換方法と、bashにあらかじめ定義されている特殊変数について解説し、変数シリーズを完結させる予定です。シェルスクリプティングの奥深い世界を、ぜひ楽しんで学んでいってください。それではまた、Tecmint.comでお会いしましょう!
-
Linuxのシェル初期化ファイルとユーザープロファイルを徹底解説
Linuxはマルチユーザー・タイムシェアリング方式のOSであり、複数のユーザーが同時に1台のシステムへログインして利用できます。そのため、システム管理者は、ソフトウェアのインストール・更新・削除、ユーザーが実行できるプログラム、閲覧・編集できるファイルなど、ユーザーごとの操作範囲を管理する役割を担っています。 Linuxでは、ユーザー環境の構築や維持を「システム全体(グローバル)」と「ユーザー固有(個人)」という2つの方法で行えます。通常、Linuxシステムを操作する基本手段はシェルであり、シェルはユーザーのログイン成功後に初期化処理として特定のファイルを読み込み、それに基づいて環境を構築しま
-
Bash変数チュートリアル – 基本からグローバル変数・ローカル変数まで学べる6つの実用例
Bash変数は、プログラムの実行期間中に必要となる情報を一時的に保存しておくための仕組みです。本記事はBashチュートリアルシリーズの一篇で、他のプログラミング言語と同様にBashでも変数を利用できることを踏まえ、基本的な使い方からグローバル変数とローカル変数の違いまでを、6つの実用的なサンプルを通じて解説します。 Bash変数の基本構文 変数の定義は非常にシンプルで、次の書式に従います。 VARNAME=VALUE 注意: 変数へ代入する際は、「=」記号の前後にスペースを入れてはいけません。「VAR=VALUE」のように書けば、シェルは「=」を代入記号として認識し、この行を変数への代入とし