シェルスクリプトを使う

変数の値の文字列操作

変数の値をcut、sed、trで処理する場合は、echoで変数内の値を処理し、その結果をパイプでそれぞれのコマンドに渡すようにします。

echo $変数名 | コマンド

●cutで処理する
$ string="1234567890"
$ echo $string | cut -c 5-8
5678

●処理した値を変数に代入する
処理全体をバッククォーテイション(`)でくくります。

変数名=`echo $変数名 | コマンド`

$ string="1234567890"
$ result=`echo $string | cut -c 5-8`
$ echo $result
5678

●ifconfigコマンドを実行し、IPアドレスを取得し、表示する
# ip_address=`ifconfig eth0 | \
sed -n 2p | cut -f2 -d: \
| cut -f1 -d" "`
# echo $ip_address

cutコマンド

cutコマンドは文字列から指定した位置にある文字あるいは文字列を抜き出します。

オプション
-b バイト数
指定バイト数の文字を取り出します。
バイト数を範囲(開始位置-終了位置)でも指定できます。

-c 文字数
指定文字数の文字を取り出します。
文字数を範囲(開始位置-終了位置)でも指定できます。

-d デリミタ
デリミタ(区切り文字)を指定します。
初期値はタブになっています。

-f
指定フィールドの文字を取り出します。
フィールドを範囲(開始位置-終了位置)でも指定できます。

-s
デリミタの無い行は無視するようにします。

<使用例>
LANのIPアドレスを取得します。
LAN_IP="`/ifconfig eth0 | grep "inet addr" | cut -d ":" -f 2 | cut -d " " -f 1`"

LANのネットワークアドレスを取得します。
LAN_NET="`netstat -rn | grep eth0 | grep 255.255.255.0 | cut -d " " -f 1`"

LANのネットマスクを取得します。
LAN_MASK="`ifconfig etho | grep Mask | cut -d ":" -f 4`"

ブロードキャストアドレスを取得します。
LAN_BCAST="`ifconfig eth0 | grep "inet addr" | cut -d ":" -f 3 | cut -d " " -f 1`"

sedコマンド

sedコマンドは文字列を置換するのに利用します。

各行の最初に一致したパターン1をパターン2に置換します。
sed -e 's/パターン1/パターン2/'

各行の最初に一致したパターンを削除します。
sed -e 's/パターン//'


全てのパターン1をパターン2に置換します。
sed -e 's/パターン1/パターン2/g'

全てのパターンを削除します。
sed -e 's/パターン//g'

アルファベットの大文字と小文字を区別しないで置換処理を行います。
sed -e 's/パターン1/パターン2/i'

●正規表現の利用
置換する文字列を探すのに正規表現が利用できます。

.
任意の1文字

*
直前の1文字の0回以上の繰り返し

^
行の先頭位置

$
行の末尾位置

[...]
列挙された任意の1文字
ハイフン(-)で範囲指定

[^...]
列挙されていない任意の1文字
ハイフン(-)で範囲指定

\+
直前の文字の1個以上の繰り返し

\?
直前の文字の0または1文字

\{i\}
直前の文字のi個の繰り返し

\{i,\}
直前の文字のi個以上の繰り返し

\{,j\}
直前の文字のj個以下の繰り返し

\{i,j\}
直前の文字のi個以上、j個以下の繰り返し

パターン1\|パターン2
パターン1またはパターン2のいずれか

\
正規表現に使われる記号の特別の意味の打ち消し

trコマンド

trコマンドは文字集合を一括変換するのに使用します。

tr [オプション] 文字集合1 [文字集合2]

文字集合を他の文字集合に一括変換します。

オプション  
-c 文字集合1を文字集合1に含まれない文字で置き換えます。
-d 文字集合1の文字を削除します。
-s 同じ連続した文字を1文字に置き換えます。
-t 文字集合1を文字集合2と同じ文字列長に合わせます。

文字集合として次のような指定もできます。
ABCD A、B、C、Dという文字の連続
A-B AからBまでの文字の範囲
[x*y] 文字xをy回繰り返す

文字集合には次のような文字クラスも利用できます。
[:alnum:] アルファベットと10進数字
[:alpha:] アルファベット
[:blank:] スペースや水平タブ
[:cntrl:] 制御文字
[:digit:] 10進数字
[:graph:] スペースを含まない表示可能な文字
[:lower:] アルファベットの小文字
[:print:] スペースを含む表示可能(印字可能)な文字(制御文字は含まない)
[:punct:] 句読点(通常の文字、数字、制御文字、スペースのいずれでもない文字)
[:space:] スペース、タブ、改ページ
[:upper:] アルファベットの大文字
[:xdigit:] 16進文字

testコマンド

testコマンドは、指定された条件式を判定し、成立していれば真を、成立していなければ偽を返します。

戻り値は$?という変数に格納されます。

test 条件式

testコマンドは、if文やcase文などの条件分岐、for文やwhile文での繰り返し条件判定などに使われます。

●testコマンドで利用できる条件式

-f ファイル 通常のファイルがあれば真(File)
-d ディレクトリ ディレクトリがあれば真(Directory)
-r ファイル ファイルが存在し、かつ読み込み可能であれば真(Readable)
-w ファイル ファイルが存在し、かつ書き込み可能であれば真(Writable)
-x ファイル ファイルが存在し、かつ実行可能であれば真(eXecutable)
-s ファイル サイズが0以上のファイルがあれば真(Size)
数値1 -eq 数値2 数値1と数値2が等しければ真(EQual)
数値1 -ge 数値2 数値1が数値2より大きい、もしくは等しければ真(Greater or Equal)
数値1 -gt 数値2 数値1が数値2より大きければ真(Greater Than)
数値1 -le 数値2 数値1が数値2より小さい、もしくは等しければ真(Less or Equal)
数値1 -lt 数値2 数値1が数値2より小さければ真(Less Than)
数値1 -ne 数値2 数値1と数値2が等しくなければ真(Not Equal)
文字列 文字列の長さが0以上であれば真
-n 文字列 文字列の長さが0以上であれば真(Not zero)
-z 文字列 文字列の長さが0であれば真(Zero)
文字列1 = 文字列2 2つの文字列が等しければ真
文字列1 != 文字列2 2つの文字列が等しくなければ真
条件式1 -a 条件式2 2つの条件式両方が真であれば真(And)
条件式1 -o 条件式2 2つの条件式いずれかが真であれば真(Or)

[ ]コマンド

[ ]コマンドは、testコマンド同様条件判定を行うコマンドです。

[ 条件式 ]
test -f hello

[ -f hello ] と同じ意味になります。

[の直後と]の直前には必ずスペースを入れる必要があります。

if文

if [ 条件式 ]
then
  処理
fi

if文の最後に「fi」を記述します。

<elseを使った書式>
if [ 条件式 ]
then
  処理1
else
  処理2
fi

<elif(else if)を使った書式>
if [ 条件式1 ]
then
  処理1
elif [ 条件式2 ]
then
  処理2
else
  処理3
fi

while文

while [ 条件式 ]
do
  処理
done

while文では、条件式が真である間、doからdoneまでのループを繰り返します。

<例>
入力した整数から1までを逆順に表示します。
「((i--))」は、変数iの値を1つデクリメントします。
「((i++))」であれば1つインクリメントします。
read i
while [ $i -gt 0 ]
do
echo $i
((i--))
done

for文(1)

for 変数名 in リスト
do
  変数を使用する処理
done

リストに指定された値を一つひとつ変数に代入しながらdo~doneのループを繰り返します。

<例>
for distribution in Centos Ubuntu Fedora
do
echo "$distribution Linux"
done

<リストにワイルドカードを使った例>
リストにはワイルドカードを使うことができます。
シェルの構文を対話的に使うこともできます。

$ for f in *.c
> do
> ls -l $f
> done

doneが入力されるまでプロンプトの形が変わっています。
doneを入力した時点でfor文が実行されます。

for文(2)

for (( 初期化 ; 継続条件 ; 再初期化 ))
do
  変数を使用する処理
done

<例>
for (( i=1 ; i < 10 ; i++ ))
do
echo $i
done

(( ))のように、かっこを二重にする必要があります。

case文

case 変数 in
  値1)
    値1にマッチしたときの処理 ;;
  値2)
    値2にマッチしたときの処理 ;;
   :
   :
  *)
    いずれの値にもマッチしなかったときの処理 ;;
esac

<例>
read month
case $month in
1|2|12)
echo "Winter." ;;
3|4|5)
echo "Spring." ;;
6|7|8)
echo "Summer." ;;
9|10|11)
echo "Autumn." ;;
*)
echo "No such month." ;;
esac

引数の処理

引数に指定された値は、シェルスクリプト内で位置パラメータを使用して参照することができます。

<例>
指定した引数に関する情報を表示します。
echo "引数1 : $1"
echo "引数2 : $2"
echo "引数の数 : $#"
echo "すべての引数 : $@"

「$@」や「$1」が位置パラメータです。
「$1」は1番目の引数を、「$2」は2番目の引数を、「$@」はすべての引数を,「$#」は引数の数を表します。

追加 2011.11.18
追加 2008.11.18
2008.08.05