==================================== While statements ==================================== while something happens; do echo a echo b done --- (program (while_statement (command (command_name (word)) (word)) (do_group (command (command_name (word)) (word)) (command (command_name (word)) (word))))) ==================================== While statements with IO redirects ==================================== while read line; do echo $line done < <(cat file) --- (program (while_statement (command (command_name (word)) (word)) (do_group (command (command_name (word)) (simple_expansion (variable_name)))) (file_redirect (process_substitution (command (command_name (word)) (word)))))) ==================================== For statements ==================================== for a in 1 2 $(seq 5 10); do echo $a done --- (program (for_statement (variable_name) (word) (word) (command_substitution (command (command_name (word)) (word) (word))) (do_group (command (command_name (word)) (simple_expansion (variable_name)))))) ==================================== If statements ==================================== if cat some_file | grep -v ok; then echo one elif cat other_file | grep -v ok; then echo two else exit fi --- (program (if_statement (pipeline (command (command_name (word)) (word)) (command (command_name (word)) (word) (word))) (command (command_name (word)) (word)) (elif_clause (pipeline (command (command_name (word)) (word)) (command (command_name (word)) (word) (word))) (command (command_name (word)) (word))) (else_clause (command (command_name (word)))))) ==================================== If statements with conditional expressions ==================================== if [ "$(uname)" == 'Darwin' ]; then echo one fi --- (program (if_statement (command (command_name (word)) (string (command_substitution (command (command_name (word))))) (word) (raw_string) (word)) (command (command_name (word)) (word)))) ==================================== Case statements ==================================== case "opt" in a) echo a ;; b) echo b ;; esac case "$Z" in ab*|cd*) ef esac --- (program (case_statement (string) (case_item (word) (command (command_name (word)) (word))) (case_item (word) (command (command_name (word)) (word)))) (case_statement (string (simple_expansion (variable_name))) (case_item (word) (word) (command (command_name (word)))))) =============================== Subshells =============================== ( ./start-server --port=80 ) & --- (program (subshell (command (command_name (word)) (word)))) =============================== Function definitions =============================== do_something() { echo ok } function do_something_else() { echo ok } function do_yet_another_thing { echo ok } 2>&1 --- (program (function_definition (word) (compound_statement (command (command_name (word)) (word)))) (function_definition (word) (compound_statement (command (command_name (word)) (word)))) (function_definition (word) (compound_statement (command (command_name (word)) (word))) (file_redirect (file_descriptor) (word))))