• R/O
  • SSH
  • HTTPS

yash: Commit


Commit MetaInfo

Revision3917 (tree)
Time2018-11-25 14:25:39
Authormagicant

Log Message

Document double-bracket command

Change Summary

Incremental Difference

--- yash/branches/double_bracket/NEWS (revision 3916)
+++ yash/branches/double_bracket/NEWS (revision 3917)
@@ -10,6 +10,7 @@
1010 ----------------------------------------------------------------------
1111 Yash 2.48
1212
13+ + The double-bracket command (the [[ ... ]] syntax)
1314 + The prompt string now can be defined with the $YASH_PS...
1415 variables.
1516 = The default value of $PS1 has been changed.
--- yash/branches/double_bracket/doc/fgrammar.txt (revision 3916)
+++ yash/branches/double_bracket/doc/fgrammar.txt (revision 3917)
@@ -202,6 +202,7 @@
202202 <<d-for-command,ForCommand>> | +
203203 <<d-while-command,WhileCommand>> | +
204204 <<d-case-command,CaseCommand>> | +
205+<<d-double-bracket-command,DoubleBracketCommand>> | +
205206 <<d-function-command,FunctionCommand>>
206207
207208 [[d-subshell]]Subshell::
@@ -232,6 +233,28 @@
232233 [[d-case-item]]CaseItem::
233234 +(+? <<d-word,Word>> (+|+ Word)* +)+ <<d-complete-program,CompleteProgram>>
234235
236+[[d-double-bracket-command]]DoubleBracketCommand::
237++[[+ <<d-ors,Ors>> +]]+
238+
239+[[d-ors]]Ors::
240+<<d-ands,Ands>> (+||+ Ands)*
241+
242+[[d-ands]]Ands::
243+<<d-nots,Nots>> (+&&+ Nots)*
244+
245+[[d-nots]]Nots::
246+++!++* <<d-primary,Primary>>
247+
248+[[d-primary]]Primary::
249+(+-b+ | +-c+ | +-d+ | +-e+ | +-f+ | +-G+ | +-g+ | +-h+ | +-k+ | +-L+ | +-N+ |
250++-n+ | +-O+ | +-o+ | +-p+ | +-r+ | +-S+ | +-s+ | +-t+ | +-u+ | +-w+ | +-x+ |
251++-z+) <<d-word,Word>> | +
252+Word (+-ef+ | +-eq+ | +-ge+ | +-gt+ | +-le+ | +-lt+ | +-ne+ | +-nt+ | +-ot+ |
253++-veq+ | +-vge+ | +-vgt+ | +-vle+ | +-vlt+ | +-vne+ | +=+ | +==+ | +===+ |
254++=~+ | +!=+ | +!==+ | +<+ | +>+) Word | +
255++(+ <<d-ors,Ors>> +)+ | +
256+Word
257+
235258 [[d-function-command]]FunctionCommand::
236259 +function+ <<d-word,Word>> (+(+ +)+)? <<d-nl,NL>>*
237260 <<d-compound-command,CompoundCommand>> <<d-redirection,Redirection>>*
@@ -261,6 +284,10 @@
261284 [[d-nl]]NL::
262285 <newline>
263286
287+In the rule for <<d-primary,Primary>>, <<d-word,Word>> tokens must not be
288++]]+. Additionally, if a Primary starts with a Word, it must not be any of the
289+possible unary operators allowed in the rule.
290+
264291 In the rule for <<d-simple-command,SimpleCommand>>, a <<d-word,Word>> token is
265292 accepted only when the token cannot be parsed as the first token of an
266293 <<d-assignment,Assignment>>.
--- yash/branches/double_bracket/doc/ja/fgrammar.txt (revision 3916)
+++ yash/branches/double_bracket/doc/ja/fgrammar.txt (revision 3917)
@@ -176,6 +176,7 @@
176176 <<d-for-command,ForCommand>> | +
177177 <<d-while-command,WhileCommand>> | +
178178 <<d-case-command,CaseCommand>> | +
179+<<d-double-bracket-command,DoubleBracketCommand>> | +
179180 <<d-function-command,FunctionCommand>>
180181
181182 [[d-subshell]]Subshell::
@@ -206,6 +207,28 @@
206207 [[d-case-item]]CaseItem::
207208 +(+? <<d-word,Word>> (+|+ Word)* +)+ <<d-complete-program,CompleteProgram>>
208209
210+[[d-double-bracket-command]]DoubleBracketCommand::
211++[[+ <<d-ors,Ors>> +]]+
212+
213+[[d-ors]]Ors::
214+<<d-ands,Ands>> (+||+ Ands)*
215+
216+[[d-ands]]Ands::
217+<<d-nots,Nots>> (+&&+ Nots)*
218+
219+[[d-nots]]Nots::
220+++!++* <<d-primary,Primary>>
221+
222+[[d-primary]]Primary::
223+(+-b+ | +-c+ | +-d+ | +-e+ | +-f+ | +-G+ | +-g+ | +-h+ | +-k+ | +-L+ | +-N+ |
224++-n+ | +-O+ | +-o+ | +-p+ | +-r+ | +-S+ | +-s+ | +-t+ | +-u+ | +-w+ | +-x+ |
225++-z+) <<d-word,Word>> | +
226+Word (+-ef+ | +-eq+ | +-ge+ | +-gt+ | +-le+ | +-lt+ | +-ne+ | +-nt+ | +-ot+ |
227++-veq+ | +-vge+ | +-vgt+ | +-vle+ | +-vlt+ | +-vne+ | +=+ | +==+ | +===+ |
228++=~+ | +!=+ | +!==+ | +<+ | +>+) Word | +
229++(+ <<d-ors,Ors>> +)+ | +
230+Word
231+
209232 [[d-function-command]]FunctionCommand::
210233 +function+ <<d-word,Word>> (+(+ +)+)? <<d-nl,NL>>*
211234 <<d-compound-command,CompoundCommand>> <<d-redirection,Redirection>>*
@@ -235,6 +258,8 @@
235258 [[d-nl]]NL::
236259 <改行>
237260
261+ルール <<d-primary,Primary>> では、<<d-word,Word>> トークンは +]]+ に一致してはなりません。また、Primary が Word トークンで始まる場合にはその Word は同ルールで認められている単項演算子に一致してはなりません。
262+
238263 ルール <<d-simple-command,SimpleCommand>> では、<<d-word,Word>> トークンはそれが <<d-assignment,Assignment>> の始まりとは解釈できない場合にのみ採用されます。
239264
240265 ルール <<d-assignment,Assignment>> では、<<d-assignment-prefix,AssignmentPrefix>> と ++(++ の間に空白を置くことはできません。
--- yash/branches/double_bracket/doc/ja/posix.txt (revision 3916)
+++ yash/branches/double_bracket/doc/ja/posix.txt (revision 3917)
@@ -17,6 +17,7 @@
1717 - link:syntax.html#for[For ループ]で展開した単語はグローバル変数として代入します。変数名はポータブルな (すなわち ASCII の範囲内の) 文字しか使えません。
1818 - link:syntax.html#case[Case 文]の最初のパターンを +esac+ にすることはできません。
1919 - 予約語 +!+ の直後に空白を置かずに +(+ を置くことはできません。
20+- link:syntax.html#double-bracket[二重ブラケットコマンド]は使えません。
2021 - 予約語 +function+ を用いる形式の{zwsp}link:syntax.html#funcdef[関数定義]構文は使えません。関数名はポータブルな (すなわち ASCII の範囲内の) 文字しか使えません。
2122 - link:syntax.html#simple[単純コマンド]での{zwsp}link:params.html#arrays[配列]の代入はできません。
2223 - シェル実行中に link:params.html#sv-lc_ctype[+LC_CTYPE+ 変数]の値が変わっても、それをシェルのロケール情報に反映しません。
--- yash/branches/double_bracket/doc/ja/syntax.txt (revision 3916)
+++ yash/branches/double_bracket/doc/ja/syntax.txt (revision 3917)
@@ -23,7 +23,7 @@
2323
2424 以下のトークンは特定の場面においてdfn:[予約語]と見なされます。予約語は複合コマンドなどを構成する一部となります。
2525
26- ! { } case do done elif else esac fi
26+ ! { } [[ case do done elif else esac fi
2727 for function if in then until while
2828
2929 これらのトークンは以下の場面において予約語となります。
@@ -232,6 +232,62 @@
232232
233233 link:posix.html[POSIX 準拠モード]では、(+|+ で区切られた最初の) {{パターン}}トークンを +esac+ にすることはできません。
234234
235+[[double-bracket]]
236+=== 二重ブラケットコマンド
237+
238+dfn:[二重ブラケットコマンド]は link:_test.html[test コマンド]に近い動作をする構文です。ブラケットに囲まれた式を展開して評価します。
239+
240+二重ブラケットコマンド構文::
241+ +[[ {{式}} ]]+
242+
243+{{式}}は単一の原子式とすることも原子式や演算子の組み合わせとすることもできます。式の構文解析は、コマンドの実行時ではなく構文解析時に行われます。演算子 (原子式の演算子もそうでないものも) は{zwsp}link:#quotes[クォート]してはなりません。クォートすると通常の単語と見なされます。
244+
245+コマンドが実行されるとき、被演算子となる単語は{zwsp}link:expand.html[四種展開]されます。ブレース展開・単語分割・パス名展開は行われません。
246+
247+二重ブラケットコマンドでは test コマンドと同様に以下の原子式が使用できます:
248+
249+単項原子式::
250+ +-b+, +-c+, +-d+, +-e+, +-f+, +-G+, +-g+, +-h+, +-k+, +-L+, +-N+, +-n+,
251+ +-O+, +-o+, +-p+, +-r+, +-S+, +-s+, +-t+, +-u+, +-w+, +-x+, +-z+
252+
253+二項原子式::
254+ +-ef+, +-eq+, +-ge+, +-gt+, +-le+, +-lt+, +-ne+, +-nt+, +-ot+, +-veq+,
255+ +-vge+, +-vgt+, +-vle+, +-vlt+, +-vne+, +===+, +!==+, +=~+, +<+, +>+
256+
257+さらに、文字列を比較するための三つの二項原子式が使用できますが、test コマンドとは動作が異なります:
258++=+ および +==+ 原子式は右辺を{zwsp}link:pattern.html[パターン]として扱い、左辺がそれにマッチするかどうかを判定します。
259++!=+ 原子式は同様の判定を行い、逆の結果を返します。
260+
261+原子式の被演算子となる単語が +]]+ であるか他の演算子と紛らわしい場合は、クォートする必要があります。
262+
263+[NOTE]
264+将来新しい種類の原子式が導入される可能性があります。ハイフンで始まる単語は全てクォートすることをお勧めします。
265+
266+[NOTE]
267+`<=` および `>=` 二項原子式は二重ブラケットコマンド内においては正しく構文解析できないため使用できません。
268+
269+以下の演算子を使用して原子式を組み合わせることができます (ここでは演算子の結合順位が高い順に示します):
270+
271++( {{式}} )+::
272+ 式を括弧で囲むと演算子の優先順位を変更できます。
273+
274++! {{式}}+::
275+ 感嘆符は式の結果を反転します。
276+
277++{{expression}} && {{expression}}+::
278+ 二重アンパサンドは連言 (論理積) を表します。両辺が共に真である時、全体も真となります。左辺が先に展開・判定されます。左辺が真である場合のみ右辺が展開・判定されます。
279+
280++{{expression}} || {{expression}}+::
281+ 二重縦棒は選言 (論理和) を表します。両辺が共に偽である時、全体も偽となります。左辺が先に展開・判定されます。左辺が偽である場合のみ右辺が展開・判定されます。
282+
283+[NOTE]
284+二重ブラケットコマンドでは、test コマンドの様に +-a+ および +-o+ を連言・選言演算子として使用することはできません。
285+
286+二重ブラケットコマンドの終了ステータスは、{{式}}が真ならば 0、偽ならば 1、展開エラーやその他の理由で判定が行えない場合は 2 です。
287+
288+[NOTE]
289+二重ブラケットコマンドは bash, ksh, mksh, zsh にもありますが、POSIX にはない拡張機能です。シェルによって多少動作が異なります。移植性を高めるには二重ブラケットコマンドよりも test コマンドを使用することをお勧めします。
290+
235291 [[funcdef]]
236292 == 関数定義
237293
--- yash/branches/double_bracket/doc/posix.txt (revision 3916)
+++ yash/branches/double_bracket/doc/posix.txt (revision 3917)
@@ -41,6 +41,7 @@
4141 - The first pattern in a link:syntax.html#case[case command] cannot be +esac+.
4242 - The +!+ keyword cannot be followed by +(+ without any whitespaces
4343 in-between.
44+- The link:syntax.html#double-bracket[double-bracket command] cannot be used.
4445 - The +function+ keyword cannot be used for link:syntax.html#funcdef[function
4546 definition]. The function must have a portable (ASCII-only) name.
4647 - link:syntax.html#simple[Simple commands] cannot assign to
--- yash/branches/double_bracket/doc/syntax.txt (revision 3916)
+++ yash/branches/double_bracket/doc/syntax.txt (revision 3917)
@@ -31,7 +31,7 @@
3131 The following tokens are treated as dfn:[keywords] depending on the context in
3232 which they appear:
3333
34- ! { } case do done elif else esac fi
34+ ! { } [[ case do done elif else esac fi
3535 for function if in then until while
3636
3737 A token is treated as a keyword when:
@@ -398,6 +398,95 @@
398398 In the link:posix.html[POSIXly-correct mode], the first pattern in a case item
399399 cannot be +esac+ (even if you do not omit the +(+ token).
400400
401+[[double-bracket]]
402+=== Double-bracket command
403+
404+The dfn:[double-bracket command] is a syntactic construct that works similarly
405+to the link:_test.html[test built-in].
406+It expands and evaluates the words between the brackets.
407+
408+Double-bracket command syntax::
409+ +[[ {{expression}} ]]+
410+
411+The {{expression}} can be a single primary or combination of primaries and
412+operators.
413+The expression syntax is parsed when the command is parsed, not executed.
414+Operators (either primary or non-primary) must not be link:#quotes[quoted], or
415+it will be parsed as a normal word.
416+
417+When the command is executed, operand words are subjected to the
418+link:expand.html[four expansions], but not brace expansion, field splitting,
419+or pathname expansion.
420+
421+In the double-bracket command, the following primaries from the test built-in
422+can be used:
423+
424+Unary primaries::
425+ +-b+, +-c+, +-d+, +-e+, +-f+, +-G+, +-g+, +-h+, +-k+, +-L+, +-N+, +-n+,
426+ +-O+, +-o+, +-p+, +-r+, +-S+, +-s+, +-t+, +-u+, +-w+, +-x+, +-z+
427+
428+Binary primaries::
429+ +-ef+, +-eq+, +-ge+, +-gt+, +-le+, +-lt+, +-ne+, +-nt+, +-ot+, +-veq+,
430+ +-vge+, +-vgt+, +-vle+, +-vlt+, +-vne+, +===+, +!==+, +=~+, +<+, +>+
431+
432+Additionally, some binary primaries can be used to compare strings, which
433+works slightly differently from those for the test built-in:
434+The +=+ primary treats the right-hand-side operand word as a
435+link:pattern.html[pattern] and tests if it matches the left-hand-side operand
436+word.
437+The +==+ primary is the same as +=+.
438+The +!=+ primary is negation of the +=+ primary (reverse result).
439+
440+The operand word of a primary must be quoted if it is +]]+ or can be confused
441+with another primary operator.
442+
443+[NOTE]
444+More primaries may be added in future versions of the shell.
445+You should quote any words that start with a hyphen.
446+
447+[NOTE]
448+The `<=` and `>=` binary primaries cannot be used in the double-bracket
449+command because it cannot be parsed correctly in the shell grammar.
450+
451+The following operands (listed in the descending order of precedence) can be
452+used to combine primaries:
453+
454++( {{expression}} )+::
455+ A pair of parentheses change operator precedence.
456+
457++! {{expression}}+::
458+ An exclamation mark negates (reverses) the result.
459+
460++{{expression}} && {{expression}}+::
461+ A double ampersand represents logical conjugation (the ``and'' operation).
462+ The entire expression is true if and only if the operand expressions are
463+ both true.
464+ The left-hand-side expression is first expanded and tested.
465+ The right-hand-side is expanded only if the left-hand-side is true.
466+
467++{{expression}} || {{expression}}+::
468+ A double vertical line represents logical conjugation (the ``or''
469+ operation).
470+ The entire expression is false if and only if the operand expressions are
471+ both false.
472+ The left-hand-side expression is first expanded and tested.
473+ The right-hand-side is expanded only if the left-hand-side is false.
474+
475+[NOTE]
476+Unlike the test built-in, neither +-a+ nor +-o+ can be used as a binary
477+operator in the double-bracket command.
478+
479+The exit status of the double-bracket command is 0 if {{expression}} is true,
480+1 if false, and 2 if it cannot be evaluated because of expansion error or any
481+other reasons.
482+
483+[NOTE]
484+The double-bracket command is also supported in bash, ksh, mksh, and zsh, but
485+not defined in the POSIX standard.
486+The behavior slightly differs between the shells.
487+The test built-in should be preferred over the double-bracket command for
488+maximum portability.
489+
401490 [[funcdef]]
402491 == Function definition
403492
Show on old repository browser