この記事は、進行中の bash チュートリアル シリーズの一部です。他のプログラミング言語と同様に、Bash にも変数が用意されています。
Bash 変数は、プログラムの存続期間中に必要となる情報を一時的に格納します。
構文:
VARNAME=VALUE
注: 変数の割り当てでは、「=」記号の周りにスペースを入れないでください。 VAR=VALUE を使用すると、シェルは「=」を記号として認識し、コマンドを変数割り当てとして扱います。 VAR =VALUE を使用すると、シェルは VAR がコマンドの名前であると想定し、それを実行しようとします。
シェルは変数の型を気にしません。変数には、文字列、整数、または実数を格納できます。
Example.1 簡単な Bash 変数割り当ての使用法
次のスクリプトは、LIST という変数を作成し、値「/var/opt/bin」を割り当てます。変数にアクセスするには、変数名の前に $ を付けるだけで、その変数に格納されている値が得られます。
$ cat sample.sh #!/bin/bash LIST="/var/opt/bin/" ls -l $LIST
上記のスクリプトを実行すると、以下に示すように /var/opt/bin が長い形式で一覧表示されます。
$ ./sample.sh total 8 drwxrwsr-x 2 bin bin 4096 Jan 29 06:43 softwares drwxr-sr-x 5 root bin 4096 Sep 2 2009 llist
Bash 変数のスコープ – ローカルおよびグローバル
Bash では、変数を宣言する必要はありません。ただし、これまで使用されていない変数にアクセスすると、警告やエラー メッセージは表示されません。代わりに、空白の値が表示されます。
例 2. bash 変数の空白値
$ cat var1.sh #!/bin/sh echo "Variable value is: $VAR1" VAR1="GEEKSTUFF" echo "Variable value is: $VAR1" $ ./var1.sh Variable value is: Variable value is: GEEKSTUFF
上記のように、最初は変数に空白の値があり、割り当てた後、値を取得できます。 export コマンドは、対話型シェルから変数をエクスポートするために使用されます。 export は、変数のスコープへの影響を示します。
例 3. エクスポートなしの Bash 変数
インタラクティブ シェルで変数に値を割り当て、シェル スクリプトで同じ値にアクセスしてみてください。
$ VAR2=LINUX $ cat var2.sh #!/bin/bash echo "VAR2=$VAR2" VAR2=UNIX echo "VAR2=$VAR2"
次に、以下に示すように上記のスクリプトを実行します。
$ ./var2.sh VAR2= VAR2=UNIX
それでも、変数 VAR2 の値は空白になります。シェルは変数 VAR2 を現在のシェルでのみ LINUX に格納します。 var2.sh の実行中に、シェルが生成され、スクリプトが実行されます。そのため、変数 VAR2 は生成されたシェルに値を持ちません。以下に示すように、変数をエクスポートして、別のプログラム (シェル スクリプトを含む) に継承させる必要があります。
例 4. Bash 変数のエクスポート
$ export VAR2=LINUX $ cat var2.sh #!/bin/bash echo "VAR2=$VAR2" VAR2=UNIX echo "VAR2=$VAR2"
上記のスクリプトを実行してください。
$ ./var2.sh VAR2=LINUX VAR2=UNIX $ $echo $VAR2 LINUX
ここで、シェル スクリプト var2.sh の実行後、VAR2 の値が LINUX になっていることがわかります。現在のシェルでスクリプトを実行しない限り、変数はインタラクティブ シェルに戻されないためです。
Bash 変数の宣言
bash で宣言ステートメントを使用すると、変数に割り当てられる値を制限できます。変数のプロパティを制限します。宣言ステートメントのオプションは、変数の型を決定するために使用されます。
構文:
declare option variablename
- 宣言はキーワードです
- オプションは次のようになります:
- -r 読み取り専用変数
- -i 整数変数
- -配列変数
- 関数の -f
- -x は、環境を介して後続のコマンドを宣言し、エクスポートします。
例 5.declare を使用した Bash 変数の宣言
$ cat declar.sh #!/bin/bash declare -i intvar intvar=123 # Assigning integer value. echo $intvar intvar=12.3 #Trying to store string type value to an integer variable echo $intvar declare -r rovar=281 rovar=212 # Trying to change the readonly variable.
以下の実行から、無効なデータを変数に割り当てたときにエラー メッセージが表示されることがわかります。
$ ./declar.sh 123 t.sh: line 6: 12.3: syntax error: invalid arithmetic operator (error token is ".3") 123 t.sh: line 11: rovar: readonly variable
グローバル Bash 変数
グローバル変数は環境変数とも呼ばれ、すべてのシェルで使用できます。すべての環境変数を表示するには、printenv コマンドを使用します。
$ printenv SHELL=/bin/bash HISTSIZE=1000 SSH_TTY=/dev/pts/1 HOME=/root LOGNAME=root CVS_RSH=ssh
ローカル Bash 変数
ローカル変数は、コード ブロック内でのみ表示されます。 local は、ローカル変数を宣言するために使用されるキーワードです。関数では、ローカル変数はその関数ブロック内でのみ意味を持ちます。
例 6. グローバルおよびローカル Bash 変数
$ cat localvar.sh #!/bin/bash pprint() { local lvar="Local content" echo -e "Local variable value with in the function" echo $lvar gvar="Global content changed" echo -e "Global variable value with in the function" echo $gvar } gvar="Global content" echo -e "Global variable value before calling function" echo $gvar echo -e "Local variable value before calling function" echo $lvar pprint echo -e "Global variable value after calling function" echo $gvar echo -e "Local variable value after calling function" echo $lvar
上記のスクリプトを実行し、
$ sh t.sh Global variable value before calling function Global content Local variable value before calling function Local variable value with in the function Local content Global variable value with in the function Global content changed Global variable value after calling function Global content changed Local variable value after calling function
上記の出力では、ローカル変数は、関数の呼び出しの前後で空の値のみを持ちます。そのスコープは関数内のみです。グローバル変数は関数の実行後も更新された値を持っていますが、関数から消えてしまいました。