1 #### Lower Case with , and ,,
2 x='ABC DEF'
3 echo ${x,}
4 echo ${x,,}
5 echo empty=${empty,}
6 echo empty=${empty,,}
7 ## STDOUT:
8 aBC DEF
9 abc def
10 empty=
11 empty=
12 ## END
13
14 #### Upper Case with ^ and ^^
15 x='abc def'
16 echo ${x^}
17 echo ${x^^}
18 echo empty=${empty^}
19 echo empty=${empty^^}
20 ## STDOUT:
21 Abc def
22 ABC DEF
23 empty=
24 empty=
25 ## END
26
27 #### Lower Case with constant string (VERY WEIRD)
28 x='AAA ABC DEF'
29 echo ${x,A}
30 echo ${x,,A} # replaces every A only?
31 ## STDOUT:
32 aAA ABC DEF
33 aaa aBC DEF
34 ## END
35
36 #### Lower Case glob
37 x='ABC DEF'
38 echo ${x,[d-f]}
39 echo ${x,,[d-f]} # This seems buggy, it doesn't include F?
40 ## STDOUT:
41 ABC DEF
42 ABC deF
43 ## END
44
45 #### ${x@Q}
46 x="FOO'BAR spam\"eggs"
47 eval "new=${x@Q}"
48 test "$x" = "$new" && echo OK
49 ## STDOUT:
50 OK
51 ## END
52
53 #### ${!prefix@} ${!prefix*} yields sorted array of var names
54 ZOO=zoo
55 ZIP=zip
56 ZOOM='one two'
57 Z='three four'
58
59 z=lower
60
61 argv.py ${!Z*}
62 argv.py ${!Z@}
63 argv.py "${!Z*}"
64 argv.py "${!Z@}"
65 for i in 1 2; do argv.py ${!Z*} ; done
66 for i in 1 2; do argv.py ${!Z@} ; done
67 for i in 1 2; do argv.py "${!Z*}"; done
68 for i in 1 2; do argv.py "${!Z@}"; done
69 ## STDOUT:
70 ['Z', 'ZIP', 'ZOO', 'ZOOM']
71 ['Z', 'ZIP', 'ZOO', 'ZOOM']
72 ['Z ZIP ZOO ZOOM']
73 ['Z', 'ZIP', 'ZOO', 'ZOOM']
74 ['Z', 'ZIP', 'ZOO', 'ZOOM']
75 ['Z', 'ZIP', 'ZOO', 'ZOOM']
76 ['Z', 'ZIP', 'ZOO', 'ZOOM']
77 ['Z', 'ZIP', 'ZOO', 'ZOOM']
78 ['Z ZIP ZOO ZOOM']
79 ['Z ZIP ZOO ZOOM']
80 ['Z', 'ZIP', 'ZOO', 'ZOOM']
81 ['Z', 'ZIP', 'ZOO', 'ZOOM']
82 ## END
83
84 #### ${!prefix@} matches var name (regression)
85 hello1=1 hello2=2 hello3=3
86 echo ${!hello@}
87 hello=()
88 echo ${!hello@}
89 ## STDOUT:
90 hello1 hello2 hello3
91 hello hello1 hello2 hello3
92 ## END
93
94 #### ${var@a} for attributes
95 array=(one two)
96 echo ${array@a}
97 declare -r array=(one two)
98 echo ${array@a}
99 declare -rx PYTHONPATH=hi
100 echo ${PYTHONPATH@a}
101
102 # bash and osh differ here
103 #declare -rxn x=z
104 #echo ${x@a}
105 ## STDOUT:
106 a
107 ar
108 rx
109 ## END
110
111 #### ${var@a} error conditions
112 echo [${?@a}]
113 ## STDOUT:
114 []
115 ## END