Tech Blog

シェル変数の基本

2021-02-23

シェル変数とは

  • シェル変数の名前には、アルファベット、数字、アンダースコアを使うことができます。
  • アルファベットの大文字小文字は区別されます。
  • シェル変数名はアルファベットの大文字を使うことが慣例となっています。
  • 変数にセットされる値はすべて文字列として処理されます。
  • 変数に値をセットするときは=を使います。(=の両脇にスペースをいれない。)
  • シェル変数は使用する前に特別に宣言する必要はない。

シェル変数をつかってみる

シェル変数名の頭に$を付けると、シェル変数が利用できます。

変数名を{}で囲むこともできます。

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

位置パラメタ

  • 渡した引数が順番に、$1〜$9までの変数にセットされる。
  • $0は実行したコマンド自身を表す。
  • 位置パラメタは$9までで、$10以上はない。
  • 書き込み禁止である。
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コマンドでその変数をほかのプロセスでも使えるようにしています。