メモ: tr, echo, read, chmod
最近、スクリプトを"Bourne Shell"に統一しようと思っています。RubyだとインストールされていないOSもあるし、Perlは大抵バンドルされているけど分かる人が少数なのです。cshとかも同様。個人的なのはこれからもPerlとかRubyで書きますが、皆が使ってメンテもするかも知れないものはそうします(というか、昔からそうだったのでは?)。
そんなわけで、"Bourne Shell"をちょっと強化中。環境は、"Cygwin"、"HP-UX"、"Fedora Core"で同じように使えることを前提にしています。バージョンは「最近のやつ」ということで。いずれも純粋な"Bourne Shell"環境ではありませんが、たぶん使えると思います。
※サンプル中のshebangは省略しています(shで実行すればshebangも実行権も要らないので)。
trで大文字小文字変換
PerlとかRubyに慣れすぎて、shだとピンと来なかったんですが、trを使えば良かったんですね。こんな風に書いて、
# trtest.sh UC=`echo ${1} | tr [a-z] [A-Z]` LC=`echo ${1} | tr [A-Z] [a-z]` echo "upper case : ${UC}" echo "lower case : ${LC}"
こんな風に実行します。
$ sh trtest.sh aZbY upper case : AZBY lower case : azby $
echoで改行しない
知ってたような気がしたんですが、あれ(";"を付ける)はVBでした。
これは環境で異なってしまうようです。
echo "hello\c" # HP-UX echo -n "hello" # Cygwin, Fedora Core
readで入力待ち
これは知りもしませんでした。STDINキーワードから離れられませんでした。
# readtest.sh echo -n "Are you agree? (y/N) > " read INPUT if [ "${INPUT}" = "y" ]; then echo "You agreed." else echo "You disagreed." fi
$ sh readtest.sh Are you agree? (y/N) > y You agreed. $ sh readtest.sh Are you agree? (y/N) > N You disagreed. $
chmodで数字じゃない第1引数
これは知っていたんですが、覚えるのが面倒そうなので覚えずにいたんです。manで調べてみたら、簡単だし、数値じゃ出来ないことも出来ることが分かったので、これからたくさん使います。
# [ugoa][+-][rwx]の組み合わせ $ chmod o-x test.sh # otherから実行権を剥奪! $ chmod a+r test.sh # user(所有者)、group、他人に読取権を与える