OILS / demo / static-vs-dynamic-assignment.sh View on Github | oilshell.org

80 lines, 41 significant
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
8argv() {
9 spec/bin/argv.py "$@"
10}
11
12demo() {
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
66dash_demo() {
67 dash $0 demo
68}
69
70# zsh is most lenient
71zsh_demo() {
72 zsh $0 demo
73}
74
75# mksh behaves more like bash
76mksh_demo() {
77 mksh $0 demo
78}
79
80"$@"