長南洋一
cyoic****@maple*****
2011年 11月 14日 (月) 21:04:03 JST
長南です。 今回取り上げるのは、「配列」サブセクションだけです。 チェックそのものは「展開」セクションの終わりまで進んでいます。 > .SS 配列 > .\"O .B Bash > .\"O provides one-dimensional indexed and associative array variables. > .\"O Any variable may be used as an indexed array; the > .B bash > は 1 次元のインデックスによる配列または連想配列の変数を扱うことができます。 > 全ての変数は配列として使用できます。 and を「または」と訳すのは、ちょっと抵抗があります。「または」は 普通 or の訳語ですし (and を「また」と訳すことはありますが)、 「または」には「どちらか片方」という意味合いがありますから。 「インデックスによる配列変数や連想配列変数」で十分だろうと思います。 「インデックスによる配列変数はもちろん、連想配列変数も」という 訳し方もあります。もっとも、「または」でも、誤解される心配はまず ないでしょうけれど。 > .\"O Indexed arrays are referenced using integers (including arithmetic > .\"O expressions) and are zero-based; associative arrays are referenced > .\"O using arbitrary strings. > インデックスによる配列は 0 からの整数 (算術式を含む) で参照し、 > 連想配列は任意の文字列で参照します。 これはきれいな訳です。でも、"Indexed arrays ... are zero-based" という原文ですし、インデックスによる配列はマイナスの整数でも参照 できるので、内容的に正しくありません。訳し方はいろいろ考えられます。 たとえば、 インデックスによる配列は整数 (算術式を含む) を使って参照します。 インデックスは 0 から始まります。 あるいは、節の順番を逆にして、 インデックスによる配列はインデックス 0 から始まり、整数 (算術式を 含む) を使って参照します。 四つか、五つ後のパラグラフで「インデックスは 0 から始まります」と 言っていますから、ここでは「0 から云々」を省略してしまう手もあるかも しれません。もっとも、マニュアルには冗長性があった方がよいと、 わたしは思いますけれど。 > .\"O An indexed array is created automatically if any variable is assigned to > .\"O using the syntax \fIname\fP[\fIsubscript\fP]=\fIvalue\fP. The > 変数の代入の際に \fIname\fP[\fIsubscript\fP]=\fIvalue\fP > という記法が使われた場合、配列は自動的に生成されます。 An indexed array is created automatically の indexed が抜けています。 「配列は」ではなく「配列が」の方がよいかもしれません。 > .\"O .I subscript > .\"O is treated as an arithmetic expression that must evaluate to a number. > .\"O If > .I subscript > は算術式として扱われますが、この式は評価すると > 数値になるものでなければなりません。 ここが、subscript が地の文に始めて現れる場所です。あとで「添字 (subscript)」として、「添字」という訳語を導入していますが、ここが 初出ですから、ここで「subscript (添字)」と訳語を示した方がよいかも しれません。「subscript (添字)」あるいは「添字 (subscript)」を どこでやるかは、難しい選択ですけれど。 > .B declare \-a \fIname\fP[\fIsubscript\fP] > .\"O .B declare \-a \fIname\fP[\fIsubscript\fP] > .\"O is also accepted; the \fIsubscript\fP is ignored. > も許されます。\fIsubscript\fP は無視されます。 小さいことですが、「... も許されますが、subscript は無視されます」と 文を切らすに、「が」でつないだほうが、意味がよく通ると思います。 > .\"O Associative arrays are created using > .\"O .BR "declare \-A \fIname\fP" . > 連想配列は > .BR "declare \-A \fIname\fP" > で作られます。 これも細かいことですが、「連想配列は declare -A name で作ります (または、 作れます)」「連想配列を作るには、declare -A name を使います」などと、 能動態でよいのではないでしょうか。 > .\"O Attributes may be > .\"O specified for an array variable using the > .\"O .B declare > .\"O and > .\"O .B readonly > .\"O builtins. Each attribute applies to all members of an array. > 組み込みコマンドの > .B declare > と > .B readonly > を使うと、配列変数に対して属性を設定できます。 > どちらの属性も配列のメンバ全てに対して適用されます。 二番目の文は each を「declare, readonly どちらのコマンドを使って 指定した属性も」と解したのでしょうが、そうだとしたら言葉が 不足しています。これはむしろ、もっと一般的に「属性のおのおのは」 ということではないでしょうか。としたら、each の訳は省略してもよく、 「各属性は」や「どの属性も」でもよいと思います。 > .\"O Any element of an array may be referenced using > .\"O ${\fIname\fP[\fIsubscript\fP]}. The braces are required to avoid > .\"O conflicts with pathname expansion. If > .\"O \fIsubscript\fP is \fB@\fP or \fB*\fP, the word expands to > .\"O all members of \fIname\fP. These subscripts differ only when the > .\"O word appears within double quotes. If the word is double-quoted, > .\"O ${\fIname\fP[*]} expands to a single > .\"O word with the value of each array member separated by the first > .\"O character of the > .\"O .SM > .\"O .B IFS > .\"O special variable, and ${\fIname\fP[@]} expands each element of > .\"O \fIname\fP to a separate word. When there are no array members, > .\"O ${\fIname\fP[@]} expands to nothing. > 配列の任意の要素は、${\fIname\fP[\fIsubscript\fP]} > を使って参照できます。 > パス名展開との衝突を避けるためにブレースが必要です。 > \fI添字(subscript)\fPが \fB@\fP か \fB*\fP ならば、その単語は > \fIname\fP の全ての要素に展開されます。これらの添字が異なるのは、 > 単語がダブルクォートの内部にある場合だけです。 「\fI添字(subscript)\fPが \fB@\fP か \fB*\fP ならば」は、(subscript) の 前後に空白がありません。ついでに言うと、「か」は、「や」もあると思います。 「その単語」というのは、要するに、${name[*]} や ${name[@]} のこと でしょうが、何かもっとピンと来る言い方はないものでしょうか。 もっとも、「定義」セクションで「単語: シェルが 1 単位とみなす文字並び」 と定義していますから、「単語」で正しいのですが ...。 「${name[*]} や ${name[@]} という単語は、name の全ての要素に展開されます」 と、一度だけ補足訳をして、「こういうのは単語と言うんだよ」と念押しして おいた方がよいかもしれません。 「これらの添字」は、指示対象が漠然としています。「この 2 つの添字」 と言った方がわかりやすいと思います。あるいは、「この 2 つの添字の働きが」 まで言うべきかもしれません。 部分的に再引用します。 > .\"O ... If the word is double-quoted, > .\"O ${\fIname\fP[*]} expands to a single > .\"O word with the value of each array member separated by the first > .\"O character of the > .\"O .SM > .\"O .B IFS > .\"O special variable, and ${\fIname\fP[@]} expands each element of > .\"O \fIname\fP to a separate word. ... > 単語がダブルクォートされていれば、${\fIname\fP[*]} は > 1 つの単語に展開されます。 「されていれば」がよいか「されていると」がよいか、迷うところです。 > この単語は、配列の各メンバの値を特殊変数 > .SM > .B IFS > の値で区切って並べたものです。${\fIname\fP[@]}は、 > \fIname\fP の各要素を別々の単語に展開します。 "by the first character of the IFS special variable" の first の訳が 抜けています。 ${\fIname\fP[@]} と「は」の間に空白がありません。 原文では、"If the word is double-quoted" から "and ${name[@]} expands each element of name to a separate word." まで一文です。訳文では 三つの文に分けていますが、三つの文の関連性をはっきりさせるために、 「一方 ${name[@]} は」、あるいは、「${name[@]} の方は」と「一方」か 「方は」を補った方がよいと思います。 > .\"O If the double-quoted expansion occurs within a word, the expansion of > .\"O the first parameter is joined with the beginning part of the original > .\"O word, and the expansion of the last parameter is joined with the last > .\"O part of the original word. > .\"O This is analogous to the expansion > .\"O of the special parameters \fB*\fP and \fB@\fP (see > .\"O .B Special Parameters > .\"O above). ${#\fIname\fP[\fIsubscript\fP]} expands to the length of > 単語の中でダブルクォートの展開が行われるときには、 > 最初のパラメータの展開結果に元の単語のダブルクォートより前の部分が > 結び付き、最後のパラメータの展開結果に元の単語のダブルクォートより > 後の部分が結び付きます。 > これは特殊パラメータ \fB*\fP や \fB@\fP に似ています (前述の > .B 特殊パラメータ > を参照)。 "This is analogous to the expansion of the special parameters * and @" の "the expansion of" の訳が抜けています。 この部分は、例の宿題と同じですね。 > .\"O Referencing an array variable without a subscript is equivalent to > .\"O referencing the array with a subscript of 0. > 配列中の要素数に展開されます。添字なしで配列変数を参照すると、 > 要素 0 を参照したことになります。 「要素 0 を参照する」という言い方は、普通に使われるのですか。 原文をそのまま訳すと、「添字 0 で配列を参照することになります」。 「添字 0 の要素を」とか「0 番目の要素を」と言っても、動作上は 同じですけれど。 > .\"O An array variable is considered set if a subscript has been assigned a > .\"O value. The null string is a valid value. > 配列変数は subscript に対して値が代入されれば > 設定されているとみなされます。 > 空文字列は有効な値です。 has been assigned 完了形だから、「代入されていれば」。 # 「何故そんなどうでもよい細かいことを」と思われるでしょうから、 # 余計かもしれませんが、少し説明しておきます。誤訳の原因で一番 # 多いものの一つが、時制を大雑把に扱うことなのです (冠詞、人称、 # 単数複数などの小さなことも、よく原因になります。いや、小さな # ことほど、ついゆるがせにするので、原因になりやすいのです)。 # 時制の解釈を誤ると、最悪では出来事の順番を逆にしてしまうという、 # とんでもないことになります。まさかと思うでしょうが、案外よくある # ことです。ですから、時制については、普段からきちんと扱うのを習慣に # しておいた方がよいのです。そんなわけで、重箱の隅つつきと不愉快に # 思われるのを承知で、あえて指摘しました。もっとも、わたしとしては、 # 重箱の隅つつきなどではなく、本来の意味での devil's advocate だと # 思っていますけれど。 > .\"O The > .\"O .BR declare , > .\"O .BR local , > .\"O and > .\"O .B readonly > .\"O builtins each accept a > .\"O .B \-a > .\"O option to specify an indexed array and a > .\"O .B \-A > .\"O option to specify an associative array. > 組み込みコマンドの > .BR declare , > .BR local , > .B readonly > いずれにおいても、 > .B \-a > オプションでインデックスによる配列を指定できます。 > .B \-A > オプションで連想配列を指定できます。 「また、-A オプションで連想配列を指定できます」と and を「また」と 訳しておいた方が、-a の場合と -A の場合のつながりがよいと思います。 今回は、「または」で始まって、「また」で終わりました。 -- 長南洋一