Jump to content 日本-日本語
日本HPホーム 製品 & サービス サポート & ドライバー ソリューション ご購入方法
お問い合わせ

製品とサービス  >  ソフトウェアとOS  >  HP-UX   >  Knowledge-on-Demand  >  UNIXの教科書 応用編

UNIXの教科書 応用編
〜はじめよう! WindowsとLinuxからのステップアップ〜

第7日目:シェルスクリプトでより便利に

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む
第7日目:シェルスクリプトでより便利に
UNIXの教科書 応用編〜はじめよう!WindowsとLinuxからのステップアップ〜 7日目
シェルスクリプトの基礎知識
シェルスクリプトの活用例

2時間目:シェルスクリプトの活用例

1時間目の説明でシェルスクリプトの基本が理解できたと思います。2時間目では、まず作成したシェルスクリプト・ファイルがカレントディレクトリになくても、コマンドとしてファイル名だけで実行できるようにする方法について説明します。続いて、ちょっと実践的なシェルスクリプトとして、拡張子をまとめて変換する例を示します。

環境変数PATHの設定

1時間目で作成したスクリプトがカレントディレクトリ以外にある場合、実行するのにそのパスを入力する必要があります。たとえば前述の「listFile」を「~/bin」ディレクトリに保存した場合には、「~/bin/listFile」と指定しなければなりません。それに対して、環境変数PATHで設定されているディレクトリに保存されているコマンドはコマンド名だけで実行できます。デフォルトでは次のようなディレクトリがコロン「:」で区切られて格納されています。

$ echo $PATH 【Enter】
/usr/bin:/usr/ccs/bin:/usr/contrib/bin:/usr/contrib/Q4/bin:/opt/perl/bin:/opt/ipf/bin:/opt/nettladm/bin:/opt/fcms/bin:/opt/wbem/bin:/opt/wbem/sbin:/opt/sas/bin:/opt/graphics/common/bin:/opt/atok/bin:/usr/bin/X11:/usr/contrib/bin/X11:/opt/sec_mgmt/bastille/bin:/opt/drd/bin:/opt/dsau/bin:/opt/dsau/sbin:/opt/resmon/bin:/opt/gnome/bin:/usr/contrib/kwdb/bin:/opt/firefox:/opt/mozilla:/opt/perl_32/bin:/opt/perl_64/bin:/opt/sfm/bin:/opt/swm/bin:/opt/sec_mgmt/spc/bin:/opt/ssh/bin:/opt/swa/bin:/opt/hpsmh/bin:/opt/gwlm/bin:/opt/mx/bin:/opt/perf/bin:/opt/prm/bin:/opt/wlm/bin:/opt/mpi/bin:/opt/vse/bin:/opt/caliper/bin:/opt/ignite/bin:/var/opt/netscape/server7/shared/bin:/var/opt/netscape/server7/bin:/opt/sentinel/bin:/opt/java1.4/jre/bin:/opt/spb/bin:/opt/thunderbird:/opt/langtools/bin:.

ここでは、自分用のコマンドの保存場所として「~/bin」ディレクトリを用意し、そこにシェルスクリプトを保存しましょう。まず、環境変数PATHに「~/bin」を追加するには次のようにします。

$ export PATH=$PATH:~/bin

マリー先生
マリー先生:
これを「export PATH=~/bin」としないように注意してね。
四色君:
そうするとどうなるのですか?
四色君
マリー先生
マリー先生:
/binや/usr/ccs/binといった最初から設定されているパスが削除されて「~/bin」のみが設定されてしまうの。つまり、lsやcpといった普通のコマンドがファイル名だけで実行できなくなるわけね。
タックス君:
ログインする度に毎回exportコマンドを実行する必要があるのですか?
タックス君
マリー先生
マリー先生:
前回で説明したシェルの環境設定ファイルで設定しておけば、その必要はないわ。

以上で、作成した「listFile」を「~/bin」ディレクトリに保存しておけばファイル名だけで実行できるようになります。

for文を利用する

続いて、複数のファイルを順に処理するのに便利なfor文について説明しましょう。次のような書式で使用します

for 変数 in リスト
do
	コマンド1
	コマンド2
	....
done

for文では、「リスト」から値を順に取り出し「変数」に格納し、「do」と「done」との間のコマンドを実行します。このとき、コマンドライン引数のリストは、シェルスクリプト内では「$*」で参照できます。たとえば、次の例はすべての引数を順に表示するシェルスクリプト「forTest」です。

#!/usr/bin/sh
for val in $*
do

 echo $val
done

このシェルスクリプト「forTest」を使用して、カレントディレクトリの下にある拡張子が「.txt」のファイルの一覧を表示するには、引数に「*.txt」を指定して次のようにします。

$ forTest *.txt
2008-3-1.txt
linus.txt
new.txt
newFile.txt
sample.txt

タックス君:
コマンドライン引数を個別に参照することはできますか?
タックス君
マリー先生
マリー先生:
もちろん。引数は順に「$1」、「$2」、「$3」…といった変数に格納されるから、それらを参照すればいいの。

変数のパターンマッチ

シェルスクリプトの便利なテクニックをもうひとつ紹介しましょう。変数から「パターン」に一致する部分を取り除くというものです。これは「パターン照合演算子」などと呼ばれ、次のような形式で使用します。

${変数名%パターン}

変数の内容の最後の部分とパターンがマッチしたら、もっとも短く一致する部分を取り除いた残りの部分を返します。たとえば、パターンに「.*」を指定することで、ファイルのパスから拡張子を取り除くといった処理が行えます。これを利用して、変数「file」に保存されているファイルの、拡張子を「txt」に変換するには次のようにします。

$ mv $file ${file%.*}.txt

タックス君:
パターン照合演算子はこれ例外にもあるのですか
タックス君
マリー先生
マリー先生:
次の4種類があるわ。各自コマンドラインで実行して結果を確認してね。

書式 説明
${変数名%パターン} 最後の部分とパターンがマッチしたら、もっとも短く一致する部分を取り除いた残りの部分を返す
${変数名%%パターン} 最後の部分とパターンがマッチしたら、もっとも長く一致する部分を取り除いた残りの部分を返す
${変数名#パターン} 先頭部分とパターンがマッチしたら、もっとも短く一致する部分を取り除いた残りの部分を返す
${変数名##パターン} 先頭部分とパターンがマッチしたら、もっとも長く一致する部分を取り除いた残りの部分を返す


引数で指定したファイルの拡張子をすべて「.txt」にする

ここまで学んだことをふまえ、引数で指定したファイルの拡張子をすべて「.txt」にそろえるシェルスクリプト例「cvext」を見てみましょう。次にリストを示します。

#!/usr/bin/sh
for val in $*
do
        new=${val%.*}.txt	←(1)
        echo "Now moving... $val to $new" ←(2)
        mv $val $new	←(3)
done

(1)で変数「val」に格納されたファイル名から拡張子を取り除き、「.txt」を加えて変数「new」に格納しています。(2)のechoコマンドでは実行中であることを画面に表示し、(3)でファイルの名前を変更しています。
次に、このcvextを使用してカレントディレクトリの下にある拡張子が「.html」と「.mail」のファイルを、拡張子「.txt」に変換する例を示します。

$ ls         ←lsコマンドで確認

index.html  info.html   new.mail    sample.txt  you.html ←元のファイル
$ cvext *.html *.mail	←シェルスクリプトを実行して拡張子を変換
Now moving... index.html to index.txt
Now moving... info.html to info.txt
Now moving... you.html to you.txt
Now moving... new.mail to new.txt
$ ls        ←lsコマンドで確認
index.txt   info.txt    new.txt     sample.txt  you.txt	←変換後のファイル

四色君:
ファイル名を変更するときに、その名前のファイルがすでにある場合は警告なしに上書きされてしまいますよね。
四色君
マリー先生
マリー先生:
そうね。たとえば、「sample.text」を「sampl.txt」に変更しようとしたときに、「sample.txt」が存在していた場合にはそのまま上書きされてしまうわ。 上書きするかどうかをその都度確認したい場合には、mvコマンドに「-i」オプションを指定するといいわよ。

mv -i  $val $new ←「-i」オプションを指定

こうすれば、同じ名前のファイルがあると確認のメッセージが表示されるの。

$ cvext *.html
Now moving... new.html to new.txt
remove new.txt? (y/n) y	←「y」で上書き

練習問題

第1問:POSIXシェルを使って、シェルスクリプト・ファイル「mycmd」を実行するコマンドはどれか?

a) sh mycmd
b) posix mycmd
c) execute mycmd
d) exec mycmd
正解はこちら
a) sh mycmd
HP-UXではPOSIXシェルのコマンド名は「sh」である。

第2問:シェルスクリプト「mycmd」をコマンドとして実行するためはファイルの先頭にどんな行を加えればよいか?

a) /usr/bin/sh
b) !usr/bin/sh
c) #!/usr/bin/sh
d) #/usr/bin/sh
正解はこちら
c) #!/usr/bin/sh
ファイルを指定したコマンドで実行するには、先頭行に「#!実行するプログラムのパス」を指定する。

第3問:変数「myfile」にあるファイルのパスが格納されているとき、拡張子を取り除いて表示するコマンドはどれか?

a) ${myfile%.*}
b) echo ${myfile%.*}
c) echo ${myfile#.*}
d) echo ${myfile#.*}
正解はこちら
b) echo ${myfile%.*}
拡張子を取り除くパターン照合演算子は「${変数名%パターン}」である。

第4問:シェルスクリプトの中で、すべてのコマンドライン引数を参照する変数はどれか?

a) $*
b) $1
c) $$
d) #*
正解はこちら
a) $*
コマンドライン引数はまとめて「$*」に格納される。個々のコマンドライン引数は順に「$1」、「$2」、「$3」…に格納される。

連載記事一覧 戻る 1  |  2

教科書シリーズ 「UNIXの教科書」 「HAクラスターの教科書」 連載記事一覧

UNIXの教科書「基礎編」

第1日目:ログインしてコマンドを実行してみる
第2日目:ディレクトリやファイルを操作してみる
第3日目:シェルの基本を知る
第4日目:ファイルの基本操作
第5日目:viエディタの操作(基本編)
第6日目:リダイレクションとパイプを活用する
期末試験

UNIXの教科書「応用編」

第1日目:grepコマンドと正規表現
第2日目:ファイルの検索
第3日目:viエディタの操作(活用編)
第4日目:ファイルの圧縮とアーカイブ
第5日目:ジョブとプロセスの操作
第6日目:シェルの環境設定
第7日目:シェルスクリプトでより便利に
期末試験

UNIXの教科書「運用編」

第1日目:ユーザーの管理
第2日目:ファイルの安全管理(その1)
第3日目:ファイルの安全管理(その2)
第4日目:ネットワークの基本を理解する
第5日目:ネットワーク関連のコマンド
第6日目:システム情報の表示
期末試験 New!

HAクラスターの教科書

第1日目:ハードウェア構成を知る
第2日目:ネットワークを設定する
第3日目:共有ディスクを構成する
第4日目:HAクラスターを構成する
第5日目:パッケージを構成する
第6日目:障害テストを実施する
期末試験

 その他の連載記事


本ページの内容は執筆時の情報に基づいており、異なる場合があります。

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

オンラインサポート
製品の標準保証でご利用いただける無償のサービスです。

ショールーム

ショールーム 導入をご検討のお客様へ
業務アプリケーションの継続・標準化・開発性とシステム担当者様、システム開発者様が抱える悩み・疑問に対する解決策実体験して頂けます。
印刷用画面へ
プライバシー ご利用条件・免責事項 ウェブマスターに連絡