Flylib.com

Books Software

 
 
 

Appendix D. Syntax

Appendix D. Syntax

Section D.1.   Reserved Words

Section D.2.   BNF for bash

 

D.1 Reserved Words

The following words are reserved words and have a special meaning to the shell when they are unquoted:

if

then

else

elif

fi

case

esac

for

while

until

do

done

function

in

select

!

{

}

time

 

 

 

 

 

 

D.2 BNF for bash

The following is the syntax of bash 2.0 in Backus-Naur Form (BNF):

{% if main.adsdop %}{% include 'adsenceinline.tpl' %}{% endif %}

<letter> ::= abcdefghijklmnopqrstuvwxyz


ABCDEFGHIJKLMNOPQRSTUVWXYZ




<digit> ::= 0123456789




<number> ::= <digit>


<number> <digit>




<word> ::= <letter>


<word> <letter>


<word> '_'




<word_list> ::= <word>


<word_list> <word>




<assignment_word> ::= <word> '=' <word>






<redirection> ::= '>' <word>


'<' <word>


<number> '>' <word>


<number> '<' <word>


'>>' <word>


<number> '>>' <word>


'<<' <word>


<number> '<<' <word>


'<&' <number>


<number> '<&' <number>


'>&' <number>


<number> '>&' <number>


'<&' <word>


<number> '<&' <word>


'>&' <word>


<number> '>&' <word>


'<<-' <word>


<number> '<<-' <word>


'>&' '-'


<number> '>&' '-'


'<&' '-'


<number> '<&' '-'


'&>' <word>


<number> '<>' <word>


'<>' <word>


'>' <word>


<number> '>' <word>




<simple_command_element> ::= <word>


<assignment_word>


<redirection>




<redirection_list> ::= <redirection>


<redirection_list> <redirection>




<simple_command> ::= <simple_command_element>


<simple_command> <simple_command_element>




<command> ::= <simple_command>


<shell_command>


<shell_command> <redirection_list>




<shell_command> ::= <for_command>


<case_command>


while <compound_list> do <compound_list> done


until <compound_list> do <compound_list> done


<select_command>


<if_command>


<subshell>


<group_command>


<function_def>




<for_command> ::= for <word> <newline_list> do <compound_list> done


for <word> <newline_list> '{' <compound_list> '}'


for <word> ';' <newline_list> do <compound_list> done


for <word> ';' <newline_list> '{' <compound_list> '}'


for <word> <newline_list> in <word_list> <list_terminator>


<newline_list> do <compound_list> done


for <word> <newline_list> in <word_list> <list_terminator>


<newline_list> '{' <compound_list> '}'




<select_command> ::= select <word> <newline_list> do <list> done


select <word> <newline_list> '{' <list> '}'


select <word> ';' <newline_list> do <list> done


select <word> ';' <newline_list> '{' list '}'


select <word> <newline_list> in <word_list>


<list_terminator> <newline_list> do <list> done


select <word> <newline_list> in <word_list>


<list_terminator> <newline_list> '{' <list> '}'




<case_command> ::= case <word> <newline_list> in <newline_list> esac


case <word> <newline_list> in <case_clause_sequence>


<newline_list> esac


case <word> <newline_list> in <case_clause> esac




<function_def> ::= <word> '(' ')' <newline_list> <group_command>


function <word> '(' ')' <newline_list> <group_command>


function <word> <newline_list> <group_command>




<subshell> ::= '(' <compound_list> ')'




<if_command> ::= if <compound_list> then <compound_list> fi


if <compound_list> then <compound_list> else <compound_list> fi


if <compound_list> then <compound_list> <elif_clause> fi




<group_command> ::= '{' <list> '}'




<elif_clause> ::= elif <compound_list> then <compound_list>


elif <compound_list> then <compound_list> else <compound_list>



elif <compound_list> then <compound_list> <elif_clause>

<case_clause> ::= <pattern_list>
<case_clause_sequence> <pattern_list>

<pattern_list> ::= <newline_list> <pattern> ')' <compound_list>
<newline_list> <pattern> ')' <newline_list>
<newline_list> '(' <pattern> ')' <compound_list>
<newline_list> '(' <pattern> ')' <newline_list>

<case_clause_sequence> ::= <pattern_list> ';;'
<case_clause_sequence> <pattern_list> ';;'

<pattern> ::= <word>
<pattern> '' <word>


<list> ::= <newline_list> <list0>

<compound_list> ::= <list>
<newline_list> <list1>

<list0> ::= <list1> '\n' <newline_list>
<list1> '&' <newline_list>
<list1> ';' <newline_list>

<list1> ::= <list1> '&&' <newline_list> <list1>
<list1> '' <newline_list> <list1>
<list1> '&' <newline_list> <list1>
<list1> ';' <newline_list> <list1>
<list1> '\n' <newline_list> <list1>
<pipeline_command>


<list_terminator> ::= '\n'


';'




<newline_list> ::=


<newline_list> '\n'




<simple_list> ::= <simple_list1>


<simple_list1> '&'


<simple_list1> ';'




<simple_list1> ::= <simple_list1> '&&' <newline_list> <simple_list1>


<simple_list1> '' <newline_list> <simple_list1>


<simple_list1> '&' <simple_list1>


<simple_list1> ';' <simple_list1>


<pipeline_command>




<pipeline_command> ::= <pipeline>


'!' <pipeline>


<timespec> <pipeline>


<timespec> '!' <pipeline>


'!' <timespec> <pipeline>




<pipeline> ::=


<pipeline> '' <newline_list> <pipeline>


<command>




<time_opt> ::= '-p'




<timespec> ::= time


time <time_opt>




.XE "BNF (Backus-Naur Form)"


.XE "bash" "syntax, BNF form of"