1 | #!/usr/bin/env bash
|
2 | #
|
3 | # TODO: Make this a spec test.
|
4 | #
|
5 | # Usage:
|
6 | # ./static-vs-dynamic-assignment.sh <function name>
|
7 |
|
8 | argv() {
|
9 | spec/bin/argv.py "$@"
|
10 | }
|
11 |
|
12 | demo() {
|
13 | # dash behaves differently here!
|
14 | local x='X X'
|
15 | local y=$x # no word splitting!
|
16 | argv "$y"
|
17 |
|
18 | # dash behaves differently here!
|
19 | local x='X z=ZZ'
|
20 | local y=$x # no word splitting!
|
21 | argv "$y"
|
22 |
|
23 | # So basically each word is at most one assignment. That is easy to
|
24 | # implement dynamically. And then we can unify export and local again.
|
25 |
|
26 | local s='a=AA b=BB c'
|
27 | local "$s" # This is a SINGLE assignment to a
|
28 | argv "$a" "$b"
|
29 | local $s # This is multiple assignments to a, b, and c
|
30 | # zsh behaves differently!
|
31 | argv "$a" "$b"
|
32 |
|
33 | local d='a=$a' # note the single quotes! It is NOT evaluated.
|
34 | local $d
|
35 | argv "$d"
|
36 | local "$d"
|
37 | argv "$d"
|
38 |
|
39 | local -a array
|
40 | array=(1 2 3) # mksh doesn't allow initialization on one line
|
41 |
|
42 | # Doh, this is parsed by bash and zsh too! And mksh somewhat supports it.
|
43 | #
|
44 | # So how do we re-run the parser? Or should we omit this for now?
|
45 | # Don't allow dynamic a[x] assignments? But 3 shells all implement it.
|
46 |
|
47 | local e='array[1+1]=42'
|
48 | local "$e" # This is a SINGLE assignment to a
|
49 | argv "${array[@]}"
|
50 |
|
51 | # Hm why is this a parse error in bash!!
|
52 | # zsh allows this!!!
|
53 | # So it dequotes them first? This makes no sense honestly.
|
54 | #local s='x="1 2 3"'
|
55 | local s="x='1 2 3'"
|
56 | local $s
|
57 | argv "$x"
|
58 |
|
59 | local s='x=1 2 3'
|
60 | # This results in a parse error!
|
61 | local $s
|
62 | argv "$x"
|
63 | }
|
64 |
|
65 | # dash is wrong
|
66 | dash_demo() {
|
67 | dash $0 demo
|
68 | }
|
69 |
|
70 | # zsh is most lenient
|
71 | zsh_demo() {
|
72 | zsh $0 demo
|
73 | }
|
74 |
|
75 | # mksh behaves more like bash
|
76 | mksh_demo() {
|
77 | mksh $0 demo
|
78 | }
|
79 |
|
80 | "$@"
|