シェルスクリプトの機能を利用する

 せっかくシェルスクリプトを利用するので、少しシェルスクリプトの機能を利用してみましょう。
 まず、以下のように最初に作ったシェルスクリプトにshebangを付けて保存します。保存するファイル名はrep2.shとします。

#!/bin/bash
sed s/INFO/営業中/ infotemp.txt > info.txt

このスクリプトだと常に同じ文字が置き換えられてしまい汎用性がありません。そこで以下のように置き換える文字をシェルスクリプトのパラメーターとして渡すようにします。

./rep2.sh 営業中

このようにパラメーターを渡すことができれば休業中の場合も以下のように指定するだけですみます。

./rep2.sh 休業中

それでは、シェルスクリプトに渡されたパラメーターを反映させてみましょう。
シェルスクリプトに渡されたパラメーターは$1のように$の後に番号を指定で参照する事ができます。$1なら最初に渡されたパラメーター、$2なら2番目のパラメーターになります。

それでは、試しにやってみましょう。以下のシェルスクリプトを作成しtest1.shというファイル名で保存します。

#!/bin/bash
echo $1

このシェルスクリプトを実行できるように権限を設定します。

chmod +x test1.sh

それでは、このシェルスクリプトを実行してみましょう。その際、パラメーターを1つ指定しておきます。以下のように指定すると画面にunixの文字が表示されます。

./test1.sh unix

パラメーターに半角空白が入ってる文字列の場合は'で囲みます。

./test1.sh '日本語 OK'

ちなみに'で囲まない場合はどうなるかやってみましょう。

./test1.sh 日本語 OK

この場合、日本語としか表示されません。シェルスクリプトの場合、半角空白で区切ると個別のパラメーターとして処理されます。

シェルスクリプトを新たに作成しテストしてみましょう。以下のシェルスクリプトを作成しtest2.shというファイル名で保存します。保存したら実行権限を付けます。

#!/bin/bash
echo $1
echo $2

以下のように入力して実行結果を見てみましょう。

./test2.sh 日本語 OK

1番目のパラメーターは日本語の文字、2番目のパラメーターはOKの文字がシェルスクリプトに渡されたのがわかります。$の後に数値を付ければ好きなパラメーターを得る事ができます。ただ、ここで注意しないといけない事があります。$9なら9番目なので$10なら10番目としたいところですが、bashの場合は${10}のように10以降の場合は{}で囲まないと期待通りの動作になりません。zshの場合は$10のように指定しても期待通りの動作をします。

せっかくなのでテストしてみましょう。bashとzshで実行できるシェルスクリプトを作成します。bash用をtest3.sh、zsh用をtest4.shというファイル名にして保存します。保存したら実行できるように権限を付けておきます。

・test3.sh

#!/bin/bash
echo $10
echo $11

・test4.sh

#!/bin/zsh
echo $10
echo $11

11個のパラメーターを指定してそれぞれ実行してみます。

./test3.sh A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11
./test4.sh A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11

bashもzshも期待通りの結果になっています。次にパラメーター全体を'で囲んでから実行してみます。

 ./test3.sh 'A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11'
./test4.sh 'A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11'

bashの場合は渡されたパラメーターの後に0や1がついてしまっています。bashの場合、$10が$1の内容と0の文字を組み合わせた状態になっています。$11の場合は$1の内容と1の文字の組み合わせになっているため図のような実行結果になっています。zshの場合は$10は$10、$11は$11として処理されます。10番目、11番目のパラメーターは渡されていないので空行が表示されています。
先ほども書きましたがbashで$10など2桁以上のパラメーターを正しく処理するためには${10}のように指定する必要があります。以下のようにシェルスクリプトを入力してtest5.shというファイル名で保存し実行権限を付けます。

#!/bin/bash
echo ${10}
echo ${11}

先ほどと同じパラメーターを指定して実行してみます。

./test5.sh 'A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11'

今度は空行が表示されました。正しく動作しています。本当に正しく動作しているのか気になる人はecho $1などを追加して確認してみてください。

説明が長くなりましたが、今回のシェルスクリプトではシェルに渡された文字列はsedのパラメーターとして指定することになります。つまり以下のように変更すればよいことになります。シェルスクリプトを入力したらrep3.shというファイル名で保存します。保存したら実行権限を付けておきます。

#!/bin/bash
sed s/INFO/$1/ infotemp.txt > info.txt

それでは以下のように入力し実行してみましょう。

./rep3.sh '営業中'
./rep3.sh '準備中'

期待通りの結果になったでしょうか。置き換える文字列を変えて実行して確認してみてください。

余談ですがシェルでは"で囲むか'で囲むか`でコマンドの実行結果が変わります。文字列を置き換えるだけなら'で囲みます。ちなみに"で囲むと文字列内に含まれる変数展開が行われます。前回の変数展開は"で囲まないパターンでしたが、文字列内に入れておくと便利な事が多々あります。

次回はパラメーターを指定し忘れた場合の処理について説明します。

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。