UN Ⅸへの招待⑩ 次は、修飾子 = の例です。 % cat example # ! /bin/sh echo ${var:= 値 } echo ${var= 値 } % example 値 % cat example # ! /bin/sh : $ { 1 ? 引数なし } % example % example example: 1 : 引数なし $ { パラメータ : + 文字列 } の場合には、パラメータに値 ( 空を含む ) カイに入されていると、全体か文字列に置き換 わります。 3 行目と 5 行目の ech 。が実行されるときは、いすれ も var の値カ啌になっていますが、 : があれはイ直に置き 換わり、なければ置き換わっていません。 $ { パラメータ : ? 文字列 } で : を省略すると、パラメー タの値カ啌の場合はメッセージ文字列が出力されなくな ります。つまり、パラメータが未設定の場合のみ文字列 がエラーメッセージとして出力されます。次の例のよう に、引数に空を指定したときはエラーメッセージが表示 されません。 % cat example # ! /bin/sh echo $ { 1 + 引数あり } echo $ { 1 : + 引数あり } % example ” " 引数あり 今月は、パラメータとその修飾子について紹介しまし た。パラメータの話は、次回以降もまだまた読けていく予 定です。どうぞお楽しみ ( ! ? ) に。 ( さかもと・あや YDC) SC 翡 UNIX MAGAZINE 好評連載中「 UN Ⅸへの招待」単行本化第 2 弾 坂本文・著 続・たのしい UN Ⅸーシェルへの招待 1 , 900 円 シェルは、 UNIX の世界のいわば「裏方さん」。その動きや仕組みを知 れば、 UNIX がいっそう楽しく、便利に使えるようになります。本書は、 たの い UNIX ひろく使われている C シェルを中心に、シェルの使い方から仕組みま の招待 ト 本 文著 で分かりやすく解説しています。前巻の『たのしい UNIX—UNIX への招待』とあわせて、ぜひご一読ください。 [ 目次から ] 1 章 知っておきたいコマンド入力のコツ 2 章 シェルとプロセス士組み 3 章 シェルの仕事 4 章 .login と . csh 「 c のサンプル C シェルの組込みコマンド、シェル変数、メタキャラクタ 付録 株式会社アスキー 〒 1 5 ト 24 東京都渋谷区代々木 4 ー 33 ー 1 0 トーシンビル 好評発売中 192 UNIX MAGAZINE 1993 ユ 1
$ { パラメータ : - 文字列 } 則述したように、 Bourne シェルでは定義していないパ ラメータ刎直を $ { パラメータ } で参照すると、何も置換え は起こりません。ところが、 $ { パラメータ : 一文字列 } を 使うと、 ・パラメータが未設定 ・パラメータか設定されていてもその値カ啌 ( ヌル ) のとき 0 ンヾラメータの値か文字列に置き換わります。つま り、、変数の値がなければ、その代わりになんらかの文字 列を利用したい " という場合にこの修飾子を用いればよ いのです。 簡単な例を見てみましよう。 % cat example # ! /bin/sh echo $var echo ${var:= 値です } % example 値です パラメータ var は未設定の変数です。そのため、 2 行 目のコマンド夫行では空行だけがエコーバックされてい ます。そして、 3 行目のコマンド実行では値です ' が工 IJN Ⅸへの招待⑩ リスト 1 修好、、 - を使わない場合 wife—% cat example # ! /bin/sh if [ $ # -eq 0 ] then host=husband else host=$l rlogin $host ー 1 aya—s wife—% example child Last login : Sun Sep child-% hostname child child—% logout Connection closed . wife—% example Last login: Sun Sep husband—% hostname husband husband—% 10g0 Ⅱ t Connection closed . wife—% 5 21 : 28 : 42 from wife 5 19 : 29 : 12 from wife とします。前号までに紹介した Bourne シェルの機能を 利用すると、リスト 1 のようにプログラムできます。 パラメータと修飾子、、一 " を使うと次のようになります。 コーバックされています。 echo ${var:= 値です } が、 echo 値です これは、 var が未設定なので、 wife—% cat example # ! /bin/sh rsh $ { 1 :—husband} ー 1 wife—% example Last login : Sun Sep husband—% hO s tname husband husband—% logout Connection closed. wife—% example child Last login : Sun Sep child—% hostname child child—% logout Connection closed . wife—% れ 2 行目の、 aya—s 5 09 : 37 : 38 on console 5 23 : 38 : 29 on console に置き換わって実行された結果です。 この機能は、プログラム中てイ吏用するパラメータの省略 値を決めておくときにイ甦リです。たとえば、、、引数窈旨定 がなかったときに特定の文字列を使う " 場合などです。例 として、 rsh ( リモートシェル ) コマンドを使い、リモー トマシンにログインするシェル・プログラムを考えてみま しよう。リモートログインするホスト名は、 1. シェル・プログラムの引数て指定する 2. シェル・プログラムの引数て指定されなかった場合は ( 固定つ husband にする UNIX MAGAZINE 1993.11 リスト 1 のプログラムにくらべて、すいぶん簡潔です 185
IJN Ⅸへの招待⑩ 位置パラメータと : $ { パラメータ . = 文字列 } こまでに説明したように では、パラメータか未設定力直が空の場合にパラメータの 値に文字列が代入されます。ところで、この形式ではパラ メータの部分に位置パラメータを指定できません。その理 由を考えてみましよう。 前号で勉強したように、位置パラメータ刎直は、 ・シェル・プログラム実行時の引数 ・ set コマンド の 2 通りの方法で代入します。そしてその値は、 $ の後 ろに位置パラメータの何番目かを示す数字を指定して参 照できます。 $ 1 $ 2 $ 3 次のように普通のパラメータに値を代入する力法では、 位置パラメータに値を代入できません。 1 = 引数 1 $ { パラメータ : = 文字列 } は、パラメータが未設定か値 が空の場合にパラメータに文字列が代入されます。 で、位置パラメータの 1 番目にないよ " を代入するため 1 = ないよ これは、 $ { 1 : = ないよ } に次のように使うと、 がなければなんらかの値を使いたい、というときはこちら 利用できます。位置パラメータ刎直の有無を調べその値 文字列に置き換えるので、パラメータに位置パラメータを しかし、 $ { パラメータ : 一文字列 } は、この形式本を 字 ) は使えないのです。 用いるときは、パラメータにイ立置パラメータ ( 1 ~ 9 の数 と実行するのと同じになります。このため修飾子、、 = " を の形式を用います。 $ { パラメータ : ? 文字列 } $ { パラメータ : ? 文字列 } では、 190 ′ラメ ータが未設定か 値カ啌の場合に、文字列がエラーメッセージとして標準 工ラー出力に出力され、シェル・プログラムの実行も終 了しますにれは、 C シェルの変数の扱いとよく似てい ます ) 。なお文字列を省略すると、 parameter null or not set " というエラーメッセージが表示されます。 では、例を見てみましよう。 % cat example # ! /bin/sh $ { 1 :?Usage : \ $ 0 \ filename} echo 第 1 引数は $ { 1 } です。 % example example : 1 : Usage : example filename % example genko 第 1 引数は ge Ⅱ k 。てす。 2 行目では、 : ( 何もしないコマンド ) を使い後続する 部分の調面だけをおこなっています。ここでは、第 1 引 数 ( $ 1 ) の有無の検査をおこない、それか未設定か値カ啌 の場合に次のメッセージを出力するようにしています。 Usage:\ $ 0 \ filename こで、 \ は直後の空白を打ち消すために使用していま す。文字列のなかに空白が入っていると、シェルか叫面し てしまうので、この例のように打ち消さなければなりませ UNIX MAGAZINE 1993.11 前例のプログラムは、 if と test を使ったこのフログラ exit ech0 Usage : $ 0 filename > & 2 then if test $ # —eq 0 シェル・プログラムを紹介しました。 工ラーメッセージを表示して実行を終了する、次のような 1993 年 8 月号では、引数の有無を検査して、なければ プログラムの実行カ鮗了します。 というメッセージか標準ェラー出力に出力さシェル・ example : 1 : Usage : example filename ログラムを実行すると、 2 行目の言己により、引数ク旨定なしにこのシェル・プ になります ) 。 $ 0 filename ん ( 実際のエラーメッセージは Usage:
IJN Ⅸへの招待⑩ リスト 4 15 do 17 14 1 % cat 18 e c 0 $PATH 16 PATH=${PATH : + ${PATH} : }$MYPATH 13 /usr/local/mh\ 12 /usr/hosts\ 11 /usr/bin\ 10 /bin\ 9 /usr/ucb\ 8 /usr/10ca1/bin/Wnn4\ 7 /usr/local/bin\ 6 /usr/bin/X11\ 5 /home/husband/aya/sh\ 4 /home/husband/aya/bin\ 3 fo て MYPATH in \ 2 PATH= # ! /bin/sh —n example /usr/ucb: /bin:/usr/bin:/usr/hosts : /usr/10ca1/mh:/usr/10ca1/X11R4/bin: /home/husband/aya/bin : /home/husband/aya/sh : /usr/bin/X11 : /usr/local/bin : /usr/10ca1/bin/Wnn4 : % example ムと上交してエラーメッセージが多少ごちやごちゃして いる ( 地頁にシェル・プログラム名と変数名が表示され る ) という点を除き、ほは同様の結果か得られます。 $ { パラメータ : + 文字列 } 最後は、 $ { パラメータ : + 文字列 } の使い方です。この 形式ではパラメータに空でない値カ武入されている場合、 全体が文字列に置き換わります。 $ { パラメータ : 一文字 列 } とは逆の働きです。リスト 4 を見てください。これ は、パラメータ PATH に次々と MYPATH の値を加えて いくというプログラムです。ただし、 PATH の値に新しい PATH=$PATH : $MYPATH このためには、 れます。 MYPATH の値を加えるだけでなく、そのあいだに : を入 UNIX MAGAZINE 1993 ユ 1 を加えた結果を PATH に代入しているわけです。 使い、値があれは・ $ { PATH } : で置き換え、それに $MYPATH : を付けたくないので、 $ { パラメータ : + 変数名 } の形式を で、 PATH の : 頁にも : が付いてしまいます。 : 頁には としてもよさそうですが、 MYPATH の最初の値は空なの : は不要 ? パラメータと修飾子について、 $ { パラメータ : ー } $ { パラメータ : = } $ { パラメータ : ? } $ { パラメータ : + } この例では、 example の引数に空を指定していますが、 $ { 1 : ーないよ } では ( : があるので ) ないよに置き換わり、 $ { 1 ーないよ } では ( 設定だけカ寸引題なので ) 置き換わって の 4 不鶤頁を勉強しました。ところで、これらの形式では : は省略してもかまいません。ただし省略すると、一と = で はパラメータが設定されているかどうかだけが間題にな り、値カ啌かどうかは関係なくなります。 % cat example # ! /bin/sh echo $ { 1 : ーないよ } echo $ { 1 ーないよ } % example " " ないよ いません。 191
UN Ⅸへの招待⑩ $ { 1 : -husband} では、 $ { 1 } すなわち ( シェル・プログラム実行時の引数 カイ直として代入されている ) 位置パラメータの 1 番目が未 設定の場合 ( 引数を指定しなかった場か、二重引用符 を使って空の引数が入力された場合、 $ { 1 : -husband} 全 体力蚊字列 husband に置き換わります。 example このため rsh コマンドは、次のように実行されます。 rsh husband ー 1 aya—s たとえばシェル・プログラムを次のように実行すると、 一方、引数カ甘旨定されているとその値に置き換わるので、 となります。 て s child ー 1 aya—s rsh コマンドは、 example child 186 では、パラメータ month が未成疋カイ直か空だった場合は、 ${month:-'date + 加 ' } たとえば、 置換された結果か文字列として使用されます。 とも可能です。この場合、メタキャラクタの働きによって の文字列の部分には、シェルのメタキャラクタを用いるこ $ { パラメータ : 一文字列 } この節の冒頭でもすこし説明しましたが、 メタキャラクタの利用 してください。 て文字列が代入されるわけではありません。その点に注意 本か文字列に置き換わるだけです。パラメータの値とし メータが未設定の場合、あるいは値が空の場合にこの形式 次項でも触れますが、 $ { パラメータ : 一文字列 } はパラ date 十 7 迎 の実行結果がこれに置き換わります。 % cat example # ! /bin/sh echo 今月は ${month : 'date + % m ( } 月 % date + %m 10 % example 今月は 10 月 余談ですが、 date + 形式 と利用すると、 SystemV 系の date コマンドでは、 形式 - て指定したとおりに date の出力 がおこなわれます。ー . ヒの例で使用した % m は、その月を数 字で表示します ( 詳細は date のマニュアルをご覧くだ さい ) 。この機能およびパラメータとイ市子一を使用し た、請求瞽を発行するシェル・プログラムをリスト 2 に 示します。簡略化したため、請 ) 頁目などは固定にして あります。また、支払期日の省略値は当月末にし、シェ ル・プログラム実行時の引数て指定すれは支謳測日を変更 できるようになっています。 $ { パラメータ : = 文字列 } 次は、 $ { パラメータ : = 文字列 } です。この形式では、 ・パラメータが未設定 ・パラメータか設定されていてもその値が空 のときにパラメータの値として文字列カイに入されます。そ して、 $ { パラメータ : = 文字列 } 本も文字列に置き換え られます。 文字列の部分には、 ( $ { パラメータ : 一文字列 } と同様 ) たんなる文字列もシェルのメタキャラクタを含む文字列 も指定できます。後者の場合は、メタキャラクタの展開 後にそれカイ直として代入されます。 この機能は、未設定の変数喇直のない変数に省略値を代 入するために使います。リスト 3 にこれを利用したシェ UNIX MAGÄZINE 1993 ユ 1
LJN Ⅸへの招待⑩ しまいました。「芸なんていいから、早く元気になってね」 と思ったのはいうまでもありません ( 反省 ) 。 まずは復習 1993 年 9 月号では、パラメータ ( 変の値の使用方 法を説明しました。簡単に復習しましよう。パラメータ 刎直を使うには、シェルのメタキャラクタ $ と { } を使い、 $ { パラメータ } と入力します。このうち、 { } を省略して次のように入力 してもかまいません。 $ パラメータ ハフメータ ' の後ろにアンダースコア ( ー ) 、英字、数字 を続ける場合は、 { } は省略できません。 Bourne シェルは、コマンド入力行で $ { パラメータ } を 検出すると、パラメータか定義されていればこの部分をそ 刎直に置き換えます。定義されていなければ何も置き換え ません ( もちろん $ { パラメータ } という文字列もなくなり ます ) 。その様子を見てみましよう。 % cat example # ! /bin/sh echo ” var の値は ? ${var} です % example var の値は ? てす こ刎列では、パラメータ var を定義していません。 のため実行結果では、 $ { v 矼 } の部分は置き換えられてい ません。 c シェルでは未定義の変数を使用すると、 変数名 : Undefined variable . というエラーメッセージか表小さオそのコマンド行は実 行されす、シェル・プログラムもその点で終了します。 184 % example echo ”この行は実行されるかな ? ” echo ”変数 var の値は ? ${var} です” # ! /bin/csh % cat example 次刎列はその様子です。 var : Undefined variable . 未定義のパラメータ (C シェルでは変印刎直を参照 した場合、 Bourne シェルと C シェルでは異なった結果 カられます。 ・ Bourne シェルでは、 ( とくにエラーにはならず ) パラ メータは置き換えられない。そのコマンド行は実行さ れる。 ・ C シェルではエラーになり、コマンド行は実行されす、 シェル・プログラムはその時点で終了する。 混同しないよう注意しましよう。 / ヾラメ ータと修飾子 以 E の知識を踏まえて、今回はパラメータとその修飾 子について勉強しましよう。 次のように使用します。 れます。こ窈多飾子には、 ? 、 + の 4 不頁があり、 Bourne シェルでは、 $ { パラメータ } に修飾子がイ寸けら 文字列 " には、たんなる文字列を使ってもシェルのメタ $ { パラメータ : + 文字列 } $ { パラメータ : ? 文字列 } $ { パラメータ : = 文字列 } $ { パラメータ : 一文字列 } UNIX MAGAZINE 1993.11 てみていきましよう。 文字列に置き換えます。それでは、個々窈多飾子につい では、パラメータか設定されていなかった場合、これを $ { パラメータ : 一文字列 } ます。たとえば、 べたり、その結果によって特定の作業をおこなったりし を使うと、 Bourne シェルはパラメータのの有無を調 置き換わるだけです。ところカシヾラメータとともにイ市子 場合は、 $ { パラメータ } の部分がたん 0 ンヾラメータ刎直に なことがおこなわれるのでしようか ? 修飾子を使わない さて、パラメータとともにイ市子を用いると、どのよう 使った場合は、置換がおこなわれます ( 言岩田は彳あ キャラクタを使ってもかまいません。メタキャラクタを
連載 OA First Look at 1 X 図 2 \spaceskip の不例 1 2 3 4 5 6 7 8 9 10 12 \vbox{ \parindent=Opt \hsize 1 .65in \spaceskip = 3.333Pt plus 20pt \xspaceskip = 1 .5\spaceskip This text is typeset in a narrow column The interword space is a110wed tO breath a 10t . And this should be actually more than enough for an example . 単語間のスペースによって決まる ( こ刎直は、 tfm ファ イルから読み込まれる ) 。 6. の CMR (Computer Modern Roman) フォン トは、左寄せ、右寄せのテキストの場合はプロポーショ ナルなフォントとして設定され、右端が不揃いなテキ ストの場合は ( マクロ \raggedright の助けを借りて ) 固定幅のフォントに設定される。 ユーザー定義マクロの例 ここで、 1 行の長さがどちらかといえば短めの文書を左 寄せ、右寄せで組んだ例を見てみよう。 \spaceskip は、 単語間のグルーを通常よりも大きくイせるように値を 設定する命令である。 ソースとその出力を図 2 に示す。 TEX 文書でのフォントの出力 次に、文書がどのように印字されるかを、フォントを中 心にみてみよう。 rIVhX による組版は、もつばら文字の、、デ イメンション ( 寸去 ) " にもとづいておこなわれる。 は、文字の、形状 " には関知しない。 dvi ファイルには、 文字を文書のどこに、どのフォントを使って印字するかと いう情報しか入っていない。 事実、関連の出力デバイスはすべてラスタ出力デ パイスである。この種のデバイスは、図形内刎固々の点を 正にするか負にするかによって文字などを出力する。これ . レーサープリンタ ・ワークステーションの画面 には、次のようなデバイスがある。 UNIX MAGAZINE 1993 ユ 1 出力結果 This text is typeset in a narrow COlt11-nn. The interword space is allowed to breath a lot. And this should be actually more than enough for an example. ・デジタル写植機 おもに 2 つの連続したピクセル間の齲囿こよって、出力 の品質が定まる。その値が出力デバイスの解像度であり、 直接生成される。 ・ gf(Generic Font) ファイル : METAFONT によって 不頁がある。 ルファイル " にオ内する。ピクセルファイルには、次の 3 ーヨ殳に、 TEX ではフォントのピクセル情報を、、ピクセ ピクセル情報 通常はインチあたりのピクセルの数て表す。 意しなければならない。工ンジンには白を出力するもの 2. 出力装置のプリンタ工ンジンごとに、 gf ファイルを用 ならない。 なので、それに対応する gf ファイルを用意しなけれは 1. 解像度の異なる出力装置ごとにピクセルバターンが必要 イルが必要になる。 の gf ファイルがある。下記の 3 つの理由から、このファ の tfm ファイルがある。フォントには、こオ人外に各種 ( 10 ポイントの Computer Modern Roman) には 1 つ たとえば、 cmrIO 前述のように、 1 つのフォント われる。 常、これは文書の処理中に 1 文字につき 1 回だけおこな 情報をプリンタにダウンロードしなければならない。通 の文書を印字する場合、すべての文字のピクセル まり使われていないので、ここでは説明しない。 ・ px1(PiXeL) ファイル : gf ファイルの前身。現在はあ ・ pk(PacKed) ファイル : gf ファイルを日孫宿したもの。 83