■シェルの変数          
変数にはユーザーが設定するユーザー変数やログイン時に読み込まれる環境変数
コマンドの実行結果などが入るユーザーが設定できない特殊変数などがあります
これらの変数を使うことでシェルスクリプトを簡略化したり複雑な処理をすることが可能
になります
また、変数とは入れ物であり、その入れ物に値を入れて必要に応じて使用します
ここではユーザーがシェルスクリプト内で使用する変数うあ特殊変数について記載します
シェル変数名について        
シェル内で使用するシェル変数はユーザーが好きにつけていいのですがいくつか約束毎が
あります
・大文字と小文字は区別される 変数AAAと変数aaaは区別されます
・アルファベットと数字、アンダースコアの組み合わせで変数をきめます
・変数の最初の文字に数字を使うことができません  
変数は一般的にすべて大文字でかかれています
サイト内で紹介させていただいていますサンプルも変数はすべて大文字で記載しています
変数の設定と使用          
シェル変数の設定は以下のようにします
これはシェル変数DIRに/home/user1/tmpを入れています
DIR=/home/user1/tmp
このシェル変数DIRを使用した簡単なスクリプト例を以下に記載します
#/bin/sh  
DIR=/home/user1/tmp
DIR2=/home/user2  
   
cp -p $DIR/file.txt $DIR2
シェル変数DIRの前に$を付けることにより、シェルスクリプト内で変数が展開され代入された
値(この場合、/home/user1/tmpやDIR2の/home/user2)が使用されます
例では/home/user1/tmp/file.txtを/home/user2へコピーしています
この使用方法は何度も同じパスがシェル内ででてくる場合に変数に代入する値だけを変え
れば済むだけになるので大変便利です
$以外での変数の使用        
書籍などのサンプルを見ますと$だけで変数を展開してる場合と${DIR}のように{}で
囲んで使用されている例をみかけることがあります
どちらも変数を展開することにはかわりませんが使用用途により異なります
STR=123    
   
echo $STR456  
※変数は展開されずなにも表示されません
echo ${STR}456  
123456  
※変数が展開され変数STRのあとに続く文字も表示
{}は変数と続けて文字を表示するときに使うといいでしょう
位置パラメタ          
位置パラメタはシェルスクリプトを実行するときに指定した引数を変数に入れて順番に展開
するときにしようします
このとき使用される変数は以下になります
$0 実行されたシェルスクリプト自身の名前が入ります
$1〜$9 $1には第1引数、$2には第2引数、第9引数まで設定されます
これらの変数は特殊変数となっており、用途がきまっているため引数としてしか使用でき
ませんので気をつけてください
以下に位置パラメタを使用した例を記載します
このシェルスクリプトをstr_view.shとして保存します
#/bin/sh  
   
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
シェルスクリプトを引数を指定して実行します
#./str_view.sh a b c d e f g h i j k n
実行結果は以下のようになります
./str_view.sh a b c d e f g h i
実行結果をみますと$0のシェルスクリプト自身の名前と指定した引数($1〜$9)がechoに
より表示されています
$9以降にしていされている引数j、k、nは変数$9以降にしていされているため表示されてません
それでは引数を10以上指定して使用したい場合はどうすればいいでしょうか
$10という引数はありませんのでshiftコマンドを使用します
以下に引数を10個以上使用した場合の例を記載します
このシェルスクリプトをstr_view2.shとして保存します
#/bin/sh
 
while ture
do
echo $1
shift
sleep 5
done
シェルスクリプトを引数を指定して実行します
#./str_view.sh a b c d e f g h i j k n
実行結果は以下のようになります
ちなみにこのシェルスクリプトは永久に動き続けるので適当なところでCtrl+Cを押して停止してください
a
b
c
d
e
f
g
h
i
j
k
n
このシェルスクリプトはechoコマンドで変数$1の内容を表示してshiftコマンドで第2引数であるbをシフトし
$1に代入して表示しています
引数はshiftコマンドにより次々と変数$1へ代入され5秒置きにechoコマンドにて表示されます
この方法を使用すれば引数が9個以上でも問題ありません
またshiftコマンドは3つ置き、4個置きなどシフトする数を指定することができます
#/bin/sh
 
while ture
do
echo $1
shift 3
sleep 5
done
実行結果は以下です
a
d
g
j
引数の数を返す変数        
シェルスクリプトに指定した引数の数を返す変数があります
$#という変数を使用します
以下のシェルスクリプトをhikisu_num.shとして保存します
#/bin/sh
 
echo $#
シェルスクリプトを実行します
#./hikisu_num.sh a b c
実行結果として引数の数である3が返されます
その他の特殊変数          
覚えておくと便利と思われます特殊変数に関して記載いたします
これらの変数にもユーザーは任意に値を入れることはできません
終了ステータスを表す$?変数        
この変数は直前のコマンドが正常に実行されたかを確認し、それにより処理を分岐させたいときに
よく使用されます
コマンドが正常に終了した場合は$?変数には0が入ります
異常終了した場合は0以外の値が入ります
例えば以下のような使い方があると思います
ファイルをコピーが成功したか失敗したかをしらべておのおのの状況により表示される文字を
変えています
   
cp -p /home/user1/sample.txt /tmp
if [ $? -eq 0 ]  
then  
echo "sample.txt is found"
else  
echo "sample.txt is not found"
fi  
実行中のプロセスIDを表す$$変数        
$$変数には現在動作しているシェルのプロセスIDが入ります
プロセスIDは動作しているプロセスすべてに振られるほかの数字とだぶらない数字になります
なのでこの変数を使ってほかとだぶらないファイル名をシェル内で一時的に作成したい場合などに使用
します
例えば以下のようなシェルスクリプトがあるとします
このシェルスクリプトの名前をcp_sample.shとします
#/bin/sh    
cp -p /home/user1/sample.txt /tmp/sample.txt.$$
このシェルスクリプトを動作させた場合のプロセスIDが1234だとします
するとコピーされたファイル名がsample.txt.1234となります
プロセスIDだといつ作成されたかが一目でわからないため、dateコマンドを使用してだぶらない
ファイル名をつける場合が多いです
           
前のページへ戻る