仮想環境の準備が整った状態で、Bashの変数機能について学習を続けます。ここではVMware仮想環境上のCentOS 7システムを例に、MobaXtermリモート計算ツールを使用した操作を説明します。本記事の参考資料として、鳥さんの「Linux私房菜:基礎版」と黒馬プログラマーのLinuxコースノート(主に基本コマンドの参照用)を使用しています。
変数の参照と設定
変数の参照
echoコマンドを使用して変数を参照するには、変数名の前に$を付加するだけです(変数名を{}で囲むことも可能です)。以下の図は、環境変数PATH、HOME、MAILを参照する方法を示しています。
補足:環境変数=グローバル変数 カスタム変数=ローカル変数 、環境変数のみが子プロセスから呼び出し可能です
変数の設定
変数の設定も非常に簡単です。変数名+"="+変数内容を直接入力するだけで設定できます。Bashでは、設定されていない変数をechoしようとすると、空値が返されますが、他のいくつかのシェルではエラーが発生する可能性があります。以下に簡単な変数代入の例を示します。
変数の設定には一定のルールに従う必要があります。例えば、C/C++では変数に値を代入する前にデータ型を指定する必要がありますが、Pythonでは必要ありません。Bashでは、変数を設定する際に以下のルールに従う必要があります:
-
"="の両側に空白文字を含めることはできません。つまり、等号の両側にスペースを入れることはできません
-
変数名は文字と数字のみで構成でき(ここで下划線"_"は含まれていません)、先頭は文字でなければなりません
-
変数内容の空白文字は" "または' 'で変数内容を結合できますが、" "は特殊文字の特性を変更せず、' '内の内容はプレーンテキストとして扱われます。以下の例を参照してください。
-
特殊文字を通常の文字に変換するには、エスケープ文字\を使用できます(主に空白文字、タブ文字、改行文字に使用します)
-
変数内で他のコマンドを呼び出す必要がある場合は、
または$を使用できます。以下の例を参照してください。 -
変数内容を拡張する場合は、"$変数名"または${変数}で内容を累積できます。例:
PATH="$PATH":/home/bin
PATH=${PATH}:/home/bin
- その変数が他のサブプロセスで実行される必要がある場合は、exportを使用して変数を環境変数にする必要があります
- 通常、大文字はシステムのデフォルト変数として使用され、カスタム変数には小文字を使用して判断しやすくします
- 変数を解除する方法は「unset 変数名」です
環境変数の機能
環境変数の参照
envまたはexportコマンドを使用してすべてのデフォルト環境変数を参照できます。以下にこれらの環境変数の機能を説明します。
- HOME:ユーザーのホームディレクトリを表します。cd ~で自分のホームディレクトリに移動する際に、この変数が使用されます。
- SHELL:現在の環境で使用されているシェルを示します。Linuxではデフォルトで/bin/bashが使用されます。
- HISTSIZE:「履歴コマンド」に関連し、以前に入力したコマンドがシステムによって記録されます。記録される数値はこの値によって設定されます。
- MAIL:mailコマンドでメールを受信する際に、システムが読み取るメールボックスファイルです。
- PATH:実行可能ファイルの検索パスです。ディレクトリ間はコロン(:)で区切られ、ファイルの検索はPATH変数内のディレクトリ順に実行されます。
- LANG:言語データです。一般的に、中国語のエンコーディングはzh_TW.Big5またはzh_TW.UTF-8です。
- RANDOM:乱数を生成する変数です。現在のほとんどのディストリビューションには乱数生成器である/dev/randomファイルがあります。関連変数$RANDOMを使用して乱数を取得できます。BASH環境では、この変数の値は0~32767の範囲内です。同時に、declareを使用して数値型を宣言することで任意の範囲の乱数を生成できます。以下に1~100の乱数を生成する方法を示します:
さらに、setコマンドを使用してすべての変数(システム変数とカスタム変数)を参照することもできます。
その他の重要なシステム変数
システム変数は、実際にはシェルの操作インターフェースに関連する変数です。環境変数の他にもいくつか重要な変数があります。そのうちのいくつかを以下に紹介します。
- PS1:プロンプト文字の設定です。特定のパラメータを変更することで、コマンドラインの先頭にあるプロンプト文字のタイプを変更できます。デフォルトの内容は[\u@\h \W]\$です。Wをwに変更すると、プロンプトが現在の完全なパスを表示するようになります。
- $:現在のシェルのプロセスID(PID)を表します。
- ?:最後に実行されたコマンドの戻り値を表します。
- export:カスタム変数を環境変数に変換します。
- locale:表示結果に影響を与える言語変数です。
変数の読み取りと宣言
- **read:**キーボードからの入力を読み取る変数
以下に、異なる言語で同じ機能を実現する例を挙げます。一目瞭然だと思います!
#C
char name[20];
printf("名前を入力してください: \n");
gets(name);
#C++
string name;
cout << "名前を入力してください: " << endl;
getline(cin,name);
#Python
print("名前を入力してください: ")
name = input()
#Bash
read -p "名前を入力してください: " name
上記はすべて、プロンプトを表示してキーボードから入力内容をname変数に格納するものです。Bashは上記の機能を実現できるだけでなく、パラメータを変更して入力を待機する時間を設定し、その時間を超過すると自動的にコマンドラインに戻ることもできます。以下のコードは、入力時間を10秒に設定する例です。
#Bash
read -p "名前を入力してください: " -t 10 name
- **declare/typeset:**変数の型を宣言する
Bash環境では、変数の型はデフォルトで文字列であるため、計算などの操作を行うためにdeclareを使用して変数の型を宣言する必要があります。次に、declareの可変パラメータを説明します:
- -a:変数を配列(array)型として定義します
- -i:変数を整数(integer)型として定義します
- -x:exportと同じ作用で、変数を環境変数に変換します
- -r:変数をreadonly型に設定します。この変数は変更できなくなり、unsetすることもできません
同時に、Bash環境での数値演算はデフォルトで整数型にしか到達できないことに注意してください。そのため、計算において"/"は整数除算と見なされます。以下は変数を使用した計算の例です。