csh 入門 ---- 入出力

プログラムには入力と出力が必要です。 1.1 では、最も簡単な出力の例として、echo を説明しました。 ここでは入力を考えましょう。

2.1 入力を返すコマンド oomu

入力を返すコマンド oomu (オオム) を作ってみましょう。 入力を意味する変数は、$< です。 コマンドが入力をまっていることを示すメッセージが必要です。 これがないと入力まちかどうか分かりません。
#!/bin/csh     
#          2.1 入力を返すコマンド oomu  
echo "名前をいれてください。"
set name = $<
echo " $name は えらい! 本当に偉い!"

ここで 入力変数 $< は、name という 変数に代入されました。 これで入力できます。 この変数を使いたいときには、$name というように $ をつけます。 1.3 で 作った 2e を用いて実行してみましょう。
% 2e oomu
% ./2e oomu
-rwxr-xr-x   1 rsaito   bin           138 Jul  3 22:43 oomu*
名前をいれてください。
Watasi      
 Watasi は えらい! 本当に偉い!
日本語を kterm からいれたい場合には、mule から マウスで copy するのが簡単です。kinput2 という日本語入力コマンドもあります。 (使いかたはここでは説明しません。)

2.2 yes/no を聞くコマンド yesno

実行の前に yes/no を聞くことは良くあります。とくに file を消 すような作業は、必ず聞くようにすることが必要です。またどんな 入力を期待しているか (y/n) のような 表示が必要です。
#!/bin/csh     
#           2.2 yes/no を聞くコマンド yesno  
echo " これで良いですか(y/n) ?"
set yes = $<
#
if ( "$yes" == "y" || "$yes" == "Y" ) then
echo " y を押しましたね。"
else
echo " y 以外を押しました。"
endif
#

入力変数を yes という 変数に代入しています。もし $yes が y か Y の時に "y を押しましたね" という表示です。それ以外は" y 以外を押しました。" という表示にします。実行してみましょう。

% yesno
 これで良いですか(y/n) ?
Y
 y を押しましたね。

if 文の詳細はあとの章で行います。言葉の比較は" == "で行いま す。== の前後にはスペースが必要です。試してみてください。

正: if ( "$yes" == "y" ) then
誤: if ( "$yes"=="y" ) then
              @  @   スペースがない!
このような過ちはエラーとして見つけにくいです。スペースがない と、if: Expression Syntax. という エラーがでます。 似たような過ちに = が 1 個しかないというのもあります。 うまくいかないときに憔悴しますがおちついて、エラーを 探してください。

" || " は "または or" を示します。ちなみに " かつ and " は && です。

単に確認をするための時には "n" だけ if で探します。こうすれば ただ改行をすれば yes と扱うことができます。その場合の表示は ([y]/n) と書きます。これは ただ改行をした場合には、y として 扱うという意味です。n だけが意味を持つという意味です。

2.3 メニュー形式の入力 menu

次も応用例が広いメニューです。switch コマンドで入力を分ける のが便利です。clear コマンドで最初に画面をきれいにします。 menu の 部分は cat を用います。eof という表示があると ころまで表示されます。echo でするより、簡単に書けますし 一つのコマンドで処理しますので高速です。
#!/bin/csh     
#           2.3 メニュー形式の入力 menu  
clear
echo " ○○ 簡単起動 メニューへようこそ ○○"
#
cat << eof

n: netscape を起動する。
r: mule を開き e-mail を読む。
s: mule を開き e-mail を送る。

eof
#
echo "上から 選んでください (n/r/s)"
set ans = $<
#
switch($ans)
case n:
  echo "ネットスケープを開きます。しばらくお待ちください"
  netscape &
  breaksw
case r:
  echo "e-mail を読みます。mule を開きます。"
  mule -f mh-rmail &
  breaksw
case s:
  echo "e-mail を送ります。mule を開きます。"
  mule -f mh-smail & 
  breaksw
default:
  echo "コマンドがリストにありません。"
endsw

入力変数 (<$) から ans という 変数に代入されこれで switch 文 で分岐します。case で 分岐できます。case の最後に breaksw を いれるのを忘れずに。default はどれにも該当しない場合に 対応します。switch 文の最後に endsw をつけます。

ここでは実行例を示しませんが、いろいろ試してみて switch 文や menu の仕組みを学んでください。また menu の表示がどのように したら分かりやすいか、標準的な書き方を学んでみてください。 メッセージはあまり多いのも感心しませんが、csh の最初の練習で は沢山いれるのが良いでしょう。そうすれば少なくてもどこまで動 いているか簡単に判別することができます。



rsaito@ee.uec.ac.jp