読者です 読者をやめる 読者になる 読者になる

argius note

プログラミング関連

メモ: 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、他人に読取権を与える

以上!