1 |
#!/bin/bash |
2 |
|
3 |
### Incomplete Function |
4 |
# code: foo() |
5 |
# status: 2 |
6 |
# BUG mksh status: 0 |
7 |
|
8 |
### Incomplete Function 2 |
9 |
# code: foo() { |
10 |
# status: 2 |
11 |
# OK mksh status: 1 |
12 |
|
13 |
### Bad function |
14 |
# code: foo(ls) |
15 |
# status: 2 |
16 |
# OK mksh status: 1 |
17 |
|
18 |
### Unbraced function body. |
19 |
# dash allows this, but bash does not. The POSIX grammar might not allow |
20 |
# this? Because a function body needs a compound command. |
21 |
# function_body : compound_command |
22 |
# | compound_command redirect_list /* Apply rule 9 */ |
23 |
# code: one_line() ls; one_line; |
24 |
# status: 0 |
25 |
# OK bash/osh status: 2 |
26 |
|
27 |
### Function with spaces, to see if ( and ) are separate tokens. |
28 |
# NOTE: Newline after ( is not OK. |
29 |
func ( ) { echo in-func; }; func |
30 |
# stdout: in-func |
31 |
|
32 |
### subshell function |
33 |
# bash allows this. |
34 |
i=0 |
35 |
j=0 |
36 |
inc() { i=$((i+5)); } |
37 |
inc_subshell() ( j=$((j+5)); ) |
38 |
inc |
39 |
inc_subshell |
40 |
echo $i $j |
41 |
# stdout: 5 0 |
42 |
|
43 |
### Hard case, function with } token in it |
44 |
rbrace() { echo }; }; rbrace |
45 |
# stdout: } |
46 |
|
47 |
### . in function name |
48 |
# bash accepts; dash doesn't |
49 |
func-name.ext ( ) { echo func-name.ext; } |
50 |
func-name.ext |
51 |
# stdout: func-name.ext |
52 |
# OK dash status: 2 |
53 |
# OK dash stdout-json: "" |
54 |
|
55 |
### = in function name |
56 |
# WOW, bash is so lenient. foo=bar is a command, I suppose. I think I'm doing |
57 |
# to disallow this one. |
58 |
func-name=ext ( ) { echo func-name=ext; } |
59 |
func-name=ext |
60 |
# stdout: func-name=ext |
61 |
# OK dash status: 2 |
62 |
# OK dash stdout-json: "" |
63 |
# OK mksh status: 1 |
64 |
# OK mksh stdout-json: "" |
65 |
|
66 |
### Function name with $ |
67 |
# bash allows this; dash doesn't. |
68 |
foo$bar() { ls ; } |
69 |
# status: 2 |
70 |
# OK bash/mksh status: 1 |
71 |
|
72 |
### Function name with ! |
73 |
# bash allows this; dash doesn't. |
74 |
foo!bar() { ls ; } |
75 |
# status: 0 |
76 |
# OK dash status: 2 |
77 |
|
78 |
### Function name with - |
79 |
# bash allows this; dash doesn't. |
80 |
foo-bar() { ls ; } |
81 |
# status: 0 |
82 |
# OK dash status: 2 |
83 |
|
84 |
### Break after ) is OK. |
85 |
# newline is always a token in "normal" state. |
86 |
echo hi; func ( ) |
87 |
{ echo in-func; } |
88 |
func |
89 |
# stdout-json: "hi\nin-func\n" |
90 |
|
91 |
### Nested definition |
92 |
# A function definition is a command, so it can be nested |
93 |
func() { |
94 |
nested_func() { echo nested; } |
95 |
nested_func |
96 |
} |
97 |
func |
98 |
# stdout: nested |
99 |
|