bash を使おう!② : 変数
今回は、変数と環境変数について説明します。
- 変数
変数はスクリプト内で使用するもので、子プロセスでは参照できません。また、代入時と参照時では表記が異るので注意が必要です。$ # 代入
$ i=0
$ # 参照
$ echo “variable i is $i”
variable i is 0
$ # for 文での使用
$ for(( i = 0; $i < 10; i++ )); do echo $i; done;
0
1
2
3
4
5
6
7
8
9
$ # 子プロセスでは参照できない
$ echo ‘echo “IN CHILED PROCESS : variable i is $i”;’ | bash
IN CHILED PROCESS : variable i is
$ - 環境変数
環境変数は伝統的に大文字で記載します。また、環境変数は別の環境変数を参照する事も多く、代入には注意が必要です。
子プロセスでも参照できますが、子プロセスの起動時に親の環境変数が子プロセスの環境変数参照領域にコピーされる関係上、子プロセス起動後に親の環境変数が変更されても子プロセスには反映されません。$ # 環境変数の代入
$ export XMANPATH=”${MANPATH}:/usr/local/share/man”
$ echo ${XMANPATH}
/usr/share/man::/usr/local/share/man
$ # 子プロセスでも参照できる
$ echo ‘echo “IN CHILED PROCESS : variable i is $XMANPATH”;’ | bash
IN CHILED PROCESS : variable i is /usr/share/man::/usr/local/share/man
$
- 参照と代入
参照や代入には注意が必要です。例えば次のような方法では失敗します。$ VALUE1=”A”
$ VALUE2=$VALUE1X
$ echo $VALUE2
$ VALUE3=C D
bash: D: command not found…
$
この問題を解決するには次の様にします。
文字列なのか変数なのかを区別すると、可読性も向上する。$ VALUE1=”A”
$ VALUE2=”${VALUE1}X”
$ echo $VALUE2
AX
$ VALUE3=”C D”
$ echo ${VALUE3}
C D
$
- 計算結果を代入する
$ RESULT=$(( 1 + 2 )); echo ${RESULT}
3
$ RESULT=$(( 3 – 2 )); echo ${RESULT}
1
$ RESULT=$(( 3 * 2 )); echo ${RESULT}
6
$ RESULT=$(( 6 * 2 )); echo ${RESULT}
12
$ RESULT=$(( 6 / 2 )); echo ${RESULT}
3
$ RESULT=$(( 6 % 4 )); echo ${RESULT}
2
$ RESULT=$(( $(( 2 + 3 )) * 4 )); echo ${RESULT}
20
$ - 実行結果を代入する
可読性の問題などから現在ではバッククォートを使用した方法は推奨されていない。$ # 古い表現
RESULT=”`date –utc`”; echo ${RESULT}
2022年 1月 7日 金曜日 01:37:13 UTC
$
$ # 通常の表現
$ RESULT=”$( date –utc )”; echo ${RESULT}
2022年 1月 7日 金曜日 01:38:32 UTC
$ - シングルコーテーション「’」とダブルコーテーション「”」
シングルコーテーションとダブルコーテーションの違いは、「$」から始まる処理を展開するかどうかです。(イベント指示子「!!」「!n」も展開される様です。ナゼ!?)
また、それぞれのコーテーションは「1つの塊にする」という意味を持ちますので、文字列として結合しても問題ありません。$ echo “My PID is $$. 2 + 3 is $(( 2 + 3 )). Now date is [$(date)]. and BASH verison is ${BASH_VERSINFO[0]}.${BASH_VERSINFO[1]}.${BASH_VERSINFO[2]}”
My PID is 563592. 2 + 3 is 5. Now date is [2022年 1月 7日 金曜日 11:28:18 JST]. and BASH verison is 5.1.8
$
$ echo ‘My PID is $$. 2 + 3 is $(( 2 + 3 )). Now date is [$(date)]. and BASH verison is ${BASH_VERSINFO[0]}.${BASH_VERSINFO[1]}.${BASH_VERSINFO[2]}’
My PID is $$. 2 + 3 is $(( 2 + 3 )). Now date is [$(date)]. and BASH verison is ${BASH_VERSINFO[0]}.${BASH_VERSINFO[1]}.${BASH_VERSINFO[2]}
$
$ echo “ABC and “‘def‘” and \”(double) in ”(single*2)“
ABC and def and “(double) in ”(single*2)
$シングルコーテーションは基本的にエスケープできません。
変数に関する事は以上ですが、もう少し知りたい場合はターミナルで「man bash」と入力してみてください。