1 #
2 # Cases from
3 # http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
4
5 # My tests
6
7 #### Empty for loop is allowed
8 set -- a b
9 for x in; do
10 echo hi
11 echo $x
12 done
13 ## stdout-json: ""
14
15 #### Empty for loop without in. Do can be on the same line I guess.
16 set -- a b
17 for x do
18 echo hi
19 echo $x
20 done
21 ## STDOUT:
22 hi
23 a
24 hi
25 b
26 ## END
27
28 #### Empty case statement
29 case foo in
30 esac
31 ## stdout-json: ""
32
33 #### Last case without ;;
34 foo=a
35 case $foo in
36 a) echo A ;;
37 b) echo B
38 esac
39 ## stdout: A
40
41 #### Only case without ;;
42 foo=a
43 case $foo in
44 a) echo A
45 esac
46 ## stdout: A
47
48 #### Case with optional (
49 foo=a
50 case $foo in
51 (a) echo A ;;
52 (b) echo B
53 esac
54 ## stdout: A
55
56 #### Empty action for case is syntax error
57 # POSIX grammar seems to allow this, but bash and dash don't. Need ;;
58 foo=a
59 case $foo in
60 a)
61 b)
62 echo A ;;
63 d)
64 esac
65 ## status: 2
66 ## OK mksh status: 1
67
68 #### Empty action is allowed for last case
69 foo=b
70 case $foo in
71 a) echo A ;;
72 b)
73 esac
74 ## stdout-json: ""
75
76 #### Case with | pattern
77 foo=a
78 case $foo in
79 a|b) echo A ;;
80 c)
81 esac
82 ## stdout: A
83
84
85 #### Bare semi-colon not allowed
86 # This is disallowed by the grammar; bash and dash don't accept it.
87 ;
88 ## status: 2
89 ## OK mksh status: 1
90
91
92
93 #
94 # Explicit tests
95 #
96
97
98
99 #### Command substitution in default
100 echo ${x:-$(ls -d /bin)}
101 ## stdout: /bin
102
103
104 #### Arithmetic expansion
105 x=3
106 while [ $x -gt 0 ]
107 do
108 echo $x
109 x=$(($x-1))
110 done
111 ## stdout-json: "3\n2\n1\n"
112
113 #### Newlines in compound lists
114 x=3
115 while
116 # a couple of <newline>s
117
118 # a list
119 date && ls -d /bin || echo failed; cat tests/hello.txt
120 # a couple of <newline>s
121
122 # another list
123 wc tests/hello.txt > _tmp/posix-compound.txt & true
124
125 do
126 # 2 lists
127 ls -d /bin
128 cat tests/hello.txt
129 x=$(($x-1))
130 [ $x -eq 0 ] && break
131 done
132 # Not testing anything but the status since output is complicated
133 ## status: 0
134
135 #### Multiple here docs on one line
136 cat <<EOF1; cat <<EOF2
137 one
138 EOF1
139 two
140 EOF2
141 ## stdout-json: "one\ntwo\n"
142
143 #### cat here doc; echo; cat here doc
144 cat <<EOF1; echo two; cat <<EOF2
145 one
146 EOF1
147 three
148 EOF2
149 ## STDOUT:
150 one
151 two
152 three
153 ## END