午前に引き続きお邪魔します
linuxでは位置パラメータとして
$0 から $9 まで使用できる変数が用意されています
$0 には実行したコマンドやシェルスクリプト等が格納されます
$1 から $9 は引数として9個まで順番に指定できます
$* ですべての引数を表します
$# で引数の数がわかります
たとえば名前が echo.sh というシェルスクリプトがあるとして
内容が以下だった場合
#!/bin/bash
echo "実行したスクリプト名 : $0"
echo "引数に指定されたのは : $1 $2 $3 $4 $5 $6 $7 $8 $9"
シェルスクリプトを実行する時に
引数として abc def ghi jkl を指定したとする
こんな感じ
./echo.sh abc def ghi jkl
すると結果は以下のようになると思います
実行したスクリプト名 : ./echo.sh
引数に指定されたのは : abc def ghi jkl
これはスクリプト内で関数に対して引数を与えた場合も
同じような扱いです
#!/bin/bash
hyouji(){
echo "実行したスクリプト名 : $0"
echo "引数にしてされたのは : $1 $2 $3 $4 $5 $6 $7 $8 $9"
}
hyouji abc def ghi jkl
結果は同じものになりますが
スクリプト実行時に与えた引数とは別に
スクリプト内でも位置パラメータが使えるので
混同しないように注意が必要です
こらだけではないですが基本はこんなところです
IFSはデリミタ(区切り文字)のことで
linuxではデフォルトが空白だったりします
なのでcsvのようなカンマ区切りに対応したい場合は
IFSをカンマに変更します
setコマンドはシェル変数の内容を表示したり
設定する場合に使います
しかし使い方を詳しく説明するとかなり長くなるので
簡単に説明すると
shやbashの場合は変数を設定する場合に
str=aaa
のようにsetコマンドを使いませんが
cshでは
set str=aaa
のようにsetコマンドを使うという違いがあります
これは自分が使用しているシェルに依存する部分で
スクリプトを作成する場合に記述内容に違いがでます
その他にIFSに基づいて位置パラメータに文字列を展開するとか
便利な使い方があるので載せておきます
set -- 位置パラメータに展開する文字列または変数
↑setの後のハイフンは2個連続
または
set --
だけの場合は位置パラメータの内容を
すべてunset(消す)することができます
という使い方で
たとえば
#!/bin/bash
set -- "aaa bbb ccc"
echo $1
echo $2
echo $3
という内容だと実行した場合に
aaa
bbb
ccc
という結果になります
これにIFSをカンマに変更したとすると
csv形式に対応することができたりします
#!/bin/bash
#変数を設定
str="aaa,bbb,ccc"
#IFSのバックアップと変更
IFS_BAK=$IFS
IFS=","
set -- $str
echo $1
echo $2
echo $3
#IFSをもとにもどす
IFS=$IFS_BAK
実行するとデリミタがカンマ区切りとなり
結果は同じものになります
内容としては少し薄いですが
参考までに・・・
補足
回答ありがとうございます。 とても丁寧でわかりやすい説明でした。 また機会があれば宜しくお願いします。