Eyes, JAPAN Blog > シェルスクリプトを書くときに

シェルスクリプトを書くときに

murakami

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

かなり暑い日々が続いておりますがいかがお過ごしでしょう、Shell担当 村上です。

さて今日ですが、先日ちょっと話題になりましたので、シェルスクリプトを書く際に使えるオプションについて少しお話をしたいと思います。
今日お話する内容ですが、シェルスクリプトではたまに見かけるset -xeuみたいなやつです。

個人的は上の3つをよく使うので基本的に今回はそれらのお話を、あと他に関しては外部の情報へのリンクということにさせていただきたいと思います。
また注意点です。

  1. 以下で記載するものに関して試す場合は個人の責任で行ってください。よく理解してない場合は大事なものが動いているところではやらない方が賢明です。
  2. POSIX準拠なShell上における話をします。部分的に対応していないShellもありますのでそこは確認してください。

さてまずこのset -*ですが、シェルのオプションを設定するものになります。(一応ですが、有効化set
-*
したものは、set +*で無効化できます。無効化であってるんですかね?+なのでちょっと書いてて気になりました。)

まずecho $-と打ってみてください。
569XZfims
私の環境では上記のようになりました。これらが現在設定されている、いわゆるオプションを表す文字の並びになります。

ではここでまず一つxオプションを紹介します。xオプションですが、これは各処理を実行する際に実行されるコマンド及び変数を展開して表示します。いわゆるデバッグ用みたいな感じですね。

さてでは早速使ってみましょう。ここでは以下のスクリプト(test_script.sh)を実行した例を提示します。


#! /usr/bin/env zsh

set -x

function show_welcome_message()
{
echo "This is welcome message [$1]"
}

echo "This is test script"
show_welcome_message $1

unset show_welcome_message

さて、まずset -xを付けない場合の動作を提示します。


% user_name=Murakami
% ./test_script.sh ${user_name}
This is test script
This is welcome message [Murakami]

そうなりますね。上記が予期した動作です。
では次にset -xを行います。ここでecho $-を行うと569XZfimsxというようにxオプションが付加されていることがわかります。


% user_name=Murakami
% ./test_script.sh ${user_name}
+zsh:20> ./test_script.sh Murakami
+./test_script.sh:10> echo 'This is test script'
This is test script
+./test_script.sh:11> show_welcome_message Murakami
+show_welcome_message:2> echo 'This is welcome message [Murakami]'
This is welcome message [Murakami]
+./test_script.sh:13> unset show_welcome_message

どうでしょう?少しわかりづらいかもしれませんが、スクリプトを呼び出す際に変数user_nameに入れていた変数が展開されて表示されていますね。このように内部動作におけるデバッグ等に使えて、スクリプトがもう少し大規模になるともっと効力が出るのではないでしょうか?

では次ですが、2つ一気に行きたいとおもいます。e, uオプションです。これらですが、以下のような挙動をします。

  • e : 任意のコマンドのステータスコードが0以外の場合、その時点で実行されているスクリプトを中断、終了する
  • u : 未定義の変数を展開しようとした場合、標準エラー出力(stderr)に対してエラーメッセージを出力する。インタラクティブシェルでない場合は即時に終了する。

という2つです。eオプションに関しては私個人のブログにて以前まとめたものがありますのでそこを見ていただければと思います。

またuオプションですが、これは簡単に試してみましょう。


#! /usr/bin/env zsh

set -u

echo "This is ${undefined_variable_name}"

上記のコードでは変数undefined_variable_nameが定義されていません。
通常ですと、


This is

というメッセージが出力されて終了するのですが、set -uを行うことで、


% ./unset_variable_script.sh
./unset_variable_script.sh:5: undefined_variable_name: parameter not set

と出て、予期されていた This is というメッセージが出るまでもなく終了しています。

このようにShellにはオプションがあり、デバッグや運用のタイミングにおいて便利に動く、また変数が未定義でパスに問題が生じる等の問題も回避することが可能です。

上記に関してはPOSIXにて定義されているようで、こちらのページ を参考にしていただけるといいかと思います。

また日本語ですとこちらも大変参考になります。(個人的にですがよく利用させて頂いてます。)

では、オプションを便利に使ってよいシェルスクリプト設計をお楽しみください。


References

担当 : 村上(暑いのは苦手です)

Comments are closed.