=
を使います。(=
の両脇にスペースをいれない。)シェル変数名の頭に$
を付けると、シェル変数が利用できます。
変数名を{}
で囲むこともできます。
DESKTOP="$HOME/Desktop"
cd $DESKTOP
cd ${DESKTOP}
$
や{}
は、シェル変数としては取り扱われず、これが変数であることを示すために
使われます。
FOO=abc
echo $FOOabc
echo ${FOO}abc
abcabc
中括弧を使うと、この部分がシェル変数だと明示的に指定できます。
シェル変数で利用できない文字が前後にある場合は、そのシェル変数を区切るものとして判断されます。
中括弧が絶対に必要というわけでもないです。
ROOT=main
CFILE=$ROOT.c
echo $CFILE
main.c
ドット(.)は変数名に使用できないため、シェル変数を区切るものと解釈され、
mainという文字列に変換されます。
sedコマンド等のクォーテーションの中に変数を含めたい場合には、ダブルクォーテーションを利用します。
OLD_TEXT=abc
NEW_TEXT=def
sed -e "s/$OLD_TEXT/$NEW_TEXT/g" < file > newfile
file
の中のabc
という文字をdef
に置き換えてnewfile
に書き出します。
VARIABLE=
VARIABLE=""
この様に書くことで、値が何も無い変数を定義しています。
シェル変数をセットし、それを利用する際の最も基本的な例です。
VARIABLE=value
echo $VARIABLE
もっと柔軟に値を設定することができ以下の 4通りの方法があります。
${variable:=value}
${variable:-value}
${variable:?value}
${variable:+value}
:
があれば、この変数がこれまで未使用(初めて登場した場合)かヌル値がセットされているときに、
後半(: 以後)の処理を行います。:
がなければ、変数がこれまで未使用の場合に限って処理します。
=
によるシェル変数の設定${variable:=value}
${valiable=value}
変数(variable)を展開しようとするときに、 これまで未使用かヌル値であればvalueを代入します。
:がない場合は、ヌルが入っている場合にも既存の値のままとなります。
echo ${ABC:=xyz} # 変数xyzが未使用のためxyzが代入される。
xyz
echo $ABC
xyz
echo ${ABC:=abc} # すでに代入されているため、abcは代入されない。
xyz
ABC="" # ヌル値をセットする
echo ${ABC=123} # :がないと、ヌルの場合に代入されない。
echo ${ABC:=123} # :がある場合、ヌル値の場合に代入される。
123
-
によるシェル変数の設定-
を使うと、=
をつかたときと微妙に異なり、
変数が未使用、未設定の状態のときに、値を代入しないまま、指定した値を
そのまま代入します。
${variable:-value}
${valiable:-value}
echo ${ABC:-xyz} # =のときと同じように代入されているように見える
xyz
echo $ABC # 代入されていない
echo ${ABC:=ABC} # =で代入する
ABC
echo $ABC # 値が代入される
ABC
#!/bin/sh
echo "The variable ${1:-abc} will be used"
./minus test
The variable test will be used
./minus
The variable abc will be used
$1に何らかの値がセットされていれば、そのままそれを使います。 $1に値がセットされていないかヌルならabcという結果を返します。
$iの値は代入されないためそのままです。
変数が書き込み禁止であっても置き換えて使用している様に見えます。
?
によるシェル変数の設定${variable:?message}
${valiable:?message}
?
は、変数がこれまで未使用、未設定であるかどうかを確認するときに使います。
未使用、未設定のときにmessageの部分が表示され処理が終了します。
echo ${ABCD:?"値が設定されていません"}
+
によるシェル変数の設定${variable:+message}
${valiable:+message}
値が設定されている場合は、変数の値を変更せずに、そのときだけ結果を変えます。(-
と同じ)
未使用未設定の場合には値が設定されません。(-
のときと逆)
ABC="" # ヌル値にする
echo ${ABC:+zzz} # 未設定の場合に値を代入するが表示されない
echo $ABC # 変数にもセットされていない
ABC=www # wwwをセット
echo $ABC
www
echo ${ABC:+zzz} # 値が設定されているため、
zzz
echo $ABC
www
cat param
#!/bin/sh
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
./param a b c d e f g h i j k l m n
./param a b c d e f g h i
shiftというコマンドを使うと、$1から$9の位置パラメタをずらす事ができます。
cat param
#!/bin/sh
shift 3
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
./param a b c d e f g h i j k l m n
./param d e f g h i j k l
cat mmm
#!/bin/sh
echo $#
./mmm
0
./mmm a b c
3
./mmm "a b c"
1
引数全体を表現するには、$*
と$@
という書き方があります。
cat kkk
#!/bin/sh
echo $*
echo $@
./kkk a b c
a b c
a b c
$?
、$$
、$!
、$-
という特殊な変数があります。
cat value
#!/bin/sh
echo $?
echo $$
echo $!
echo $-
./value
0
21300
hB
$?
変数コマンド実行時の終了ステータスを表す関数です。
$$
変数現在動作しているコマンドのプロセスIDがセットされます。
$!
変数&
を使ってコマンドをバックグラウンドで走らせたときのコマンドのプロセスIDがこの$!
にセットされます。
$-
変数シェルの起動時のフラグや、setコマンドを使って設定したフラグの一覧がセットされています。
そのコマンドだけ有効になるように変数を設定することができます。
CFLAGS=-g make
CFLAGSという変数に-g
という値をセットし、この値を設定した状態でmakeコマンドが実行されます。
変数の設定は、そのコマンドと同じ行に、コマンドの直前で行います。セミコロンを使って区切ってはいけません。
以下と同義となります。
(CFLAGS=-g; export CFLAGS; make)
セットした変数が他のコマンドに影響を与えないように中括弧で囲みます。 CFLAGSという変数をセットして、exportコマンドでその変数をほかのプロセスでも使えるようにしています。