SBクリエイティブ

正誤情報

【正誤情報】入門UNIXシェルプログラミング 改訂第2版

2010.05.06
対象書籍
入門UNIXシェルプログラミング 改訂第2版

下記のような誤りがありました。お詫びの上、訂正させていただきます。


 

■第18刷発行後に発見された点

●第2章:p.55、上から12行目
<修正前>
中括弧でいくつかのコマンドを括って、
<修正後>
丸括弧あるいは中括弧でいくつかのコマンドを括って、

※注: bashでは$$ではなく$BASHPIDを使うと、丸括弧や中括弧で別の子プロセスを作ったとき、親のプロセスIDではなく自分のプロセスIDが代入されます。

●第2章:p.56、下から3行目
<修正前>
括弧で囲みます。
<修正後>
括弧で囲みます。

●第3章:p.66下から3行目からp.67ページ上1行目まで差し替え
<修正後>
 また、${VAR:=}の代わりに${VAR:?}を使うと、変数に値が設定されていないという理由でスクリプトを終了させることができます。
: ${VAR:=”VAR is not set.”}
-> 変数VARに、「VAR is not set.」という文字列を代入して続行する。
: ${VAR:?”exit script because VAR is not set.”}
-> 上記文字列を出力して終了する。

●第3章:p.74、上から14行目
<修正前>
enter yes or no -> yes #yesとキーボードからタイプする
<修正後>
enter yes or no –> yes #yesとキーボードからタイプする

●第3章:p.74、下から6行目
<修正前>
Echo -n “enter some words -> ” または echo “enter some words -> c”
Read ANS1 ANS2 ANS3
<修正後>
Echo -n “enter some words –> ” または echo “enter some words –> c”
Read ANS1 ANS2 ANS3

●第3章:p.74、下から2行目
<修正前>
enter some words -> abc xyz 567 #3つの文字列を入力
<修正後>
enter some words –> abc xyz 567 #3つの文字列を入力

●第3章:p.80、上から7~9行目
<修正前>
[ $NUM1 -lt $NUM2 -o $NUM1 -gt $NUM3 -a $NUM2 -le $NUM3 ]
    $NUM1 が$NUM2 より大きいか、あるいは
    $NUM1 が$NUM3 以上であり$NUM2 が$NUM3 より小さいとき真
<修正後>
[ $NUM1 -lt $NUM2 -o $NUM1 -gt $NUM3 -a $NUM2 -le $NUM3 ]
    $NUM1 が$NUM2 より小さいか、あるいは
    $NUM1 が$NUM3 より大きく$NUM2 が$NUM3 以下のとき真

●第6章:p.146、下から4行目
<修正前>
VARUE=
<修正後>
VALUE=

 


 

■第16刷発行時に修正済みの点

●第9章:p.237、上から14行目
<修正前:綴り修正>
echo “$1 is availavle.”
<修正後>
echo “$1 is available.”

●第9章:p.241、下から16行目
<修正前:1行から2行に>
return $_PING >/dev/null 2>&1
<修正後>
$_PING >/dev/null 2>&1
return $?


●第9章:p.242、上側リストの行番号33と34
<修正前>
33:
34: return $_PING >/dev/null 2>&1
<修正後>
33: $_PING >/dev/null 2>&1
34: return $?

 


 

■第8刷発行時に修正済みの点

●大扉裏「本書のサポートページについて」
<修正前:URL変更>
http://books-support.sbcr.jp/isbn/2194/
<修正後>
http://isbn.sbcr.jp/21946/


●「はじめに」:p.xxxiii
<修正前:URL変更>
http://books-support.sbcr.jp/isbn/2194/
<修正後>
http://isbn.sbcr.jp/21946/


●第4章:p.89、上から15行目~下から3行目
<修正前>
これは普通にls -l というコマンドを実行したものです。
…(中略)…
$ ls -l 0< xyz
<修正後>
これは普通にls -lを実行したものです。ここでは、ls -lコマンドも、その引数であるabcやnnnという文字列も、標準入力(すなわちキーボード)から入力しています。これらをファイルから読み込ませることが標準入力のリダイレクションとなります。
「ls -l abc nnn」と書き込んだファイル(xyzとします)を用意します。このファイルを0番にリダイレクトさせればいいのですが、何に対してリダイレクトさせるかが問題となるところです。lsコマンドの入力はログインシェル上で行っているので、ここではshに対するリダイレクションとなります。

$ cat xyz
ls -l abc nnn
$ sh < xyz # xyz ファイルを「sh の標準入力」としてリダイレクトする
-rw-r–r– 1 user usergrp 7 Sep 26 23:51 abc
-rw-r–r– 1 user usergrp 43 Sep 26 23:52 nnn
$ # 結果は ls -l abc nnn を入力したときと同じ

先ほどは標準出力を表わす1が省略されていたのと同じく、ここでは標準入力の0を省略しています。省略しない場合は次のように書き表します。

$ sh 0< xyz


●第9章:p.236
<修正前:URL変更>
http://books-support.sbcr.jp/isbn/2194/
<修正後>
http://isbn.sbcr.jp/21946/


●第10章:p.273
<修正前:URL変更>
http://books-support.sbcr.jp/isbn/2194/
<修正後>
http://isbn.sbcr.jp/21946/


●奥付のサポートページURL
<修正前:URL変更>
サポートページ:http://books-support.sbcr.jp/isbn/2194/
<修正後>
サポートページ:http://isbn.sbcr.jp/21946/

 


 

■第7刷発行時に修正済みの点

●第3章:p.66~p.67
<修正前:p.66の上から16行目~p.67の上から7行目(「注意」の最後)まで>

また次のように、パラメタ(引数)を後ろに付けることも許されています。
…(中略)…
【注意!】 : は常に真を返すので、$VARの値が何であろうとelseの判定に行くことはありま
せん。

<修正後>

また:の特別な使用法として、変数の設定だけを行わせることができます。「2.4 シェル変数の初期設定」で記述した方法による変数設定を:の直後に書くと条件によって変数をセットすることが可能です。
たとえば、${variable:=value}の形式を用いて次のように記述したとします。

: ${VAR:=abc}

${VAR:=abc}は、変数VARが未使用かヌルであればabcという値を代入するという書き方です。変数VARに何か値が代入されていれば変更しません。よって上記のように:の引数として変数をセットしておけば、変数VARに値がセットされていないときにabcという値を代入し、変数VARに値が代入されていればそのまま何もしない、という処理を行います。
:コマンドを使って変数のデフォルト値を設定できるわけです。:ではなくechoを使うと変数を展開して表示します。そういう表示をさせずに設定だけでいいというときに利用できます。
また、変数に値が設定されていない場合はスクリプトの処理を続行できないというときには、以下のようにすればメッセージを出力し、その時点でスクリプトを終了します。

: ${VAR:=”exit script because VAR is not set.”}

:コマンドは本当に「何もしない」わけではなく、引数として与えた変数の設定は行うということに気を付けてください。


●第3章:p.70、上から10行目
<修正前>
$ eval echo $”$VAR2″
<修正後>
$ eval echo $$VAR2 または $ eval echo $”$VAR2″

●第3章:p.71、上から13行目
<修正前>
$ eval echo $”$VAR2″
<修正後>
$ eval echo $$VAR2


●第3章:p.71、上から21行目
<修正前>
$ eval ‘echo $”$VAR2″‘
<修正後>
$ eval `echo $$VAR2`

●第3章:p.72、一番上の「注意」部分の内容
<修正前>
Linux やSolaris のbash を使っていると、記述内容とは違った動作をします。
…(中略)…
$VAR1
<修正後>
$$VAR2ではなく$”$VAR2″という書き方をした場合には、LinuxやSolarisのbashではちょっと異なった動作をします。
・Linux、Solarisのbash
$ eval echo $”$VAR2″ 出力は VAR1
$ eval echo $$VAR2 出力は value
・標準のsh
$ eval echo $”$VAR2″ 出力は value
$ eval echo $$VAR2 出力は value
この原因はecho $”$VAR2″をVAR1とするか$VAR1とするかの違いです。kshやzsh、FreeBSDのbashは標準shと同じ動作です。


●第3章:p.83、上から3行目
<修正前>
シェルが始めから持っている変数(PATH やIFS などたくさんあります)はunset で きません。
<修正後>
ほとんどの変数をunsetすることが可能ですが、Solarisの場合は、シェルが始めから持っている変数(PATHやIFSなど)をunsetすることができません。


●第4章:p.99、上から7行目
<段落末に文章追加>
ただし、現在ではほとんどのシェルがwhile内で設定した変数の値はそのまま利用可能になっています。できないままなのはSolarisのshくらいです。


●第6章:p.144、上から4行目
<段落末に文章追加>
このcase文では?ではなく?とします。getoptsが指定オプション以外の文字を?という文字で扱うからです。


●第11章:p.356、下から7行目
<修正前>
x 実行された内容を出力する
<修正後>
x 実行するコマンドの内容を出力する

 


 

■第4刷発行時に修正済みの点

●第2章:p.53、上から10行目
<修正前>
if [ $# -eq 0 ];
<修正後>
if [ $# -eq 0 ]; then

●第7章:p.175、下から3-1行目
<修正前>
また、ファイルの最後の 4 行を消すには、
sed -e ‘$-3,$d’ file
と書きます。$-3 は最後から数えて 3 行目、つまり下から 4 行目のことです。
<修正後>
ただし、次のように最終行の $ から何行目という指定はできません。
sed -e ‘$-3,$d’ file
sed では $-3 のような相対的な行の表現ができずにエラーになります。最後の行から数行をまとめて消したい場合には、最後の行が何行目なのかを先に調べるか、最後の行だけを消す処理を何回か繰り返すことで対応します。

●第7章:p.175、上記の修正に伴う修正点
誌面の都合で、同ページの上から1-2行目、上から7-8行目を変更しました。

<上から1-2行目:修正前>
最終行を指定するときには何行目か分からなくてもかまいません。$ が最終行を表わします。
<上から1-2行目:修正後>
ファイルの最終行何行目か分からなくても $ を使って表現できます。

<上から7-8行目:修正前>
また行数は実際の行を超え指定してもかまいません。10 行しかないファイルに対して
<上から7-8行目:修正後>
また実際の行を超えた行指定もかまいません。10 行しかないファイルに、

 


 

■第2刷発行時に修正済みの点

●はじめに:p.xxi、上から11-12行目
<修正前>
Linux の場合は/bin/sh と表示されていても実体は/bin/bash という別物になってます
<修正後>
ただし Linux の/bin/sh は /bin/bash のリンクなので、機能も豊富で使いやすいものです
<修正内容について>
修正前も間違いではありませんが、「別物」だとBシェルの機能を利用できないのではないかと誤解される方がいらしたので、改めました。

 


 

この記事をシェアする