1#! /bin/sh
2#
3# @(#)parameter.sh	1.15 20/04/28 Copyright 2016-2020 J. Schilling
4#
5
6# Read test core functions
7. ../../common/test-common
8
9docommand param1 "$SHELL -c 'parameter=param; echo \${parameter:-word}'" 0 "param\n" ""
10docommand param2 "$SHELL -c 'parameter=\"\"; echo \${parameter:-word}'" 0 "word\n" ""
11docommand param3 "$SHELL -c 'unset parameter; echo \${parameter:-word}'" 0 "word\n" ""
12
13docommand param4 "$SHELL -c 'parameter=param; echo \${parameter-word}'" 0 "param\n" ""
14docommand param5 "$SHELL -c 'parameter=\"\"; echo \${parameter-word}'" 0 "\n" ""
15docommand param6 "$SHELL -c 'unset parameter; echo \${parameter-word}'" 0 "word\n" ""
16
17docommand param7 "$SHELL -c 'parameter=param; echo \${parameter:=word}'" 0 "param\n" ""
18docommand param8 "$SHELL -c 'parameter=\"\"; echo \${parameter:=word}'" 0 "word\n" ""
19docommand param9 "$SHELL -c 'unset parameter; echo \${parameter:=word}'" 0 "word\n" ""
20
21docommand param10 "$SHELL -c 'parameter=param; echo \${parameter=word}'" 0 "param\n" ""
22docommand param11 "$SHELL -c 'parameter=\"\"; echo \${parameter=word}'" 0 "\n" ""
23docommand param12 "$SHELL -c 'unset parameter; echo \${parameter=word}'" 0 "word\n" ""
24
25docommand param13 "$SHELL -c 'parameter=param; echo \${parameter:?word}'" 0 "param\n" ""
26docommand param14 "$SHELL -c 'parameter=\"\"; echo \${parameter:?word}'" "!=0" "" IGNORE
27docommand param15 "$SHELL -c 'unset parameter; echo \${parameter:?word}'" "!=0" "" IGNORE
28
29docommand param16 "$SHELL -c 'parameter=param; echo \${parameter?word}'" 0 "param\n" ""
30docommand param17 "$SHELL -c 'parameter=\"\"; echo \${parameter?word}'" 0 "\n" ""
31docommand param18 "$SHELL -c 'unset parameter; echo \${parameter?word}'" "!=0" "" IGNORE
32
33docommand param19 "$SHELL -c 'parameter=param; echo \${parameter:+word}'" 0 "word\n" ""
34docommand param20 "$SHELL -c 'parameter=\"\"; echo \${parameter:+word}'" 0 "\n" ""
35docommand param21 "$SHELL -c 'unset parameter; echo \${parameter:+word}'" 0 "\n" ""
36
37docommand param22 "$SHELL -c 'parameter=param; echo \${parameter+word}'" 0 "word\n" ""
38docommand param23 "$SHELL -c 'parameter=\"\"; echo \${parameter+word}'" 0 "word\n" ""
39docommand param24 "$SHELL -c 'unset parameter; echo \${parameter+word}'" 0 "\n" ""
40
41docommand param25 "$SHELL -c 'echo \$#'" 0 "0\n" ""
42docommand param26 "$SHELL -c 'echo \${#}'" 0 "0\n" ""
43docommand param27 "$SHELL -c 'unset bla; echo \${#bla}'" 0 "0\n" ""
44docommand param28 "$SHELL -c 'bla=ttt; echo \${#bla}'" 0 "3\n" ""
45docommand param29 "$SHELL -c 'bla=ttt; echo \$#bla'" 0 "0bla\n" ""
46docommand param30 "$SHELL -c 'bla=\"\"; echo \${#bla}'" 0 "0\n" ""
47
48docommand param31 "$SHELL -c 'var=dlsfkjslfjalbla; echo \${var%*bla}'" 0 "dlsfkjslfjal\n" ""
49docommand param32 "$SHELL -c 'var=dlsfkjslfjalbla; echo \${var%%*bla}'" 0 "\n" ""
50
51docommand param33 "$SHELL -c 'var=bladlsfkblajslfjal; echo \${var#*bla}'" 0 "dlsfkblajslfjal\n" ""
52docommand param34 "$SHELL -c 'var=bladlsfkblajslfjal; echo \${var##*bla}'" 0 "jslfjal\n" ""
53
54docommand param35 "$SHELL -c 'var=/home/joerg; echo \${var%*rg}'" 0 "/home/joe\n" ""
55docommand param36 "$SHELL -c 'var=/home/joerg; echo \${var%%*rg}'" 0 "\n" ""
56
57docommand param37 "$SHELL -c 'var=/home/joerg; echo \${var#/h*}'" 0 "ome/joerg\n" ""
58docommand param38 "$SHELL -c 'var=/home/joerg; echo \${var##/h*}'" 0 "\n" ""
59
60docommand param39 "$SHELL -c 'echo \${#}'" 0 "0\n" ""
61
62expect_fail_save=$expect_fail
63expect_fail=true
64docommand param40 "$SHELL -c 'echo \${#:}'" "0" "0\n" ""	# POSIX unspecified
65expect_fail=$expect_fail_save
66if [ "$failed" = true ] && [ "$is_bosh" = true ]; then
67	fail "$cmd_label: is not expected to fail with bosh"
68elif [ "$failed" = true ] ; then
69	echo
70	echo "Test $cmd_label is unspecified behavior by POSIX."
71	echo
72fi
73
74docommand param41 "$SHELL -c 'echo \${#:-99}'" "0" "0\n" ""
75docommand param42 "$SHELL -c 'echo \${#:+99}'" "0" "99\n" ""
76docommand param43 "$SHELL -c 'echo \${#:-99}' a 1 2 3" "0" "3\n" ""
77docommand param44 "$SHELL -c 'echo \${#-99}'" "0" "0\n" ""
78docommand param45 "$SHELL -c 'echo \${#+99}'" "0" "99\n" ""
79docommand param46 "$SHELL -c 'echo \${#?99}'" "0" "0\n" ""
80docommand param47 "$SHELL -c 'echo \${#=99}'" "0" "0\n" ""
81
82expect_fail_save=$expect_fail
83expect_fail=true
84docommand param50 "$SHELL -c 'echo \${xxx:}'" 0 "\n" ""		# POSIX unspecified
85expect_fail=$expect_fail_save
86if [ "$failed" = true ] && [ "$is_bosh" = true ]; then
87	fail "$cmd_label: is not expected to fail with bosh"
88elif [ "$failed" = true ] ; then
89	echo
90	echo "Test $cmd_label is unspecified behavior by POSIX."
91	echo
92fi
93
94expect_fail_save=$expect_fail
95expect_fail=true
96docommand param51 "$SHELL -c 'echo \${xxx:a}'" "!=0" "" IGNORE
97expect_fail=$expect_fail_save
98if [ "$failed" = true ] && [ "$is_bosh" = true ]; then
99	fail "$cmd_label: is not expected to fail with bosh"
100elif [ "$failed" = true ] ; then
101	echo
102	echo "Test $cmd_label is unspecified behavior by POSIX."
103	echo
104fi
105
106expect_fail_save=$expect_fail
107expect_fail=true
108docommand param52 "$SHELL -c 'xxx=/home/joerg; echo \${xxx:}'" 0 "/home/joerg\n" ""
109expect_fail=$expect_fail_save
110if [ "$failed" = true ] && [ "$is_bosh" = true ]; then
111	fail "$cmd_label: is not expected to fail with bosh"
112elif [ "$failed" = true ] ; then
113	echo
114	echo "Test $cmd_label is unspecified behavior by POSIX."
115	echo
116fi
117
118#
119# Test from Robert Elz <kre@munnari.oz.au>
120# $ set -- "abab*cbb"
121# $ echo "${1} ${1#a} ${1%b} ${1##ab} ${1%%b} ${1#*\*} ${1%\**}"
122#
123cmd='set -- "abab*cbb"; echo "${1} ${1#a}"'
124docommand param53 "$SHELL -c '$cmd'" 0 "abab*cbb bab*cbb\n" ""
125cmd='set -- "abab*cbb"; echo ${1} ${1#a}'
126docommand param54 "$SHELL -c '$cmd'" 0 "abab*cbb bab*cbb\n" ""
127
128cmd='set -- "abab*cbb"; echo "${1} ${1%b}"'
129docommand param55 "$SHELL -c '$cmd'" 0 "abab*cbb abab*cb\n" ""
130cmd='set -- "abab*cbb"; echo ${1} ${1%b}'
131docommand param56 "$SHELL -c '$cmd'" 0 "abab*cbb abab*cb\n" ""
132
133cmd='set -- "abab*cbb"; echo "${1} ${1##ab}"'
134docommand param57 "$SHELL -c '$cmd'" 0 "abab*cbb ab*cbb\n" ""
135cmd='set -- "abab*cbb"; echo ${1} ${1##ab}'
136docommand param58 "$SHELL -c '$cmd'" 0 "abab*cbb ab*cbb\n" ""
137
138cmd='set -- "abab*cbb"; echo "${1} ${1%%b}"'
139docommand param59 "$SHELL -c '$cmd'" 0 "abab*cbb abab*cb\n" ""
140cmd='set -- "abab*cbb"; echo ${1} ${1%%b}'
141docommand param60 "$SHELL -c '$cmd'" 0 "abab*cbb abab*cb\n" ""
142
143cmd='set -- "abab*cbb"; echo "${1} ${1#*\*}"'
144docommand param61 "$SHELL -c '$cmd'" 0 "abab*cbb cbb\n" ""
145cmd='set -- "abab*cbb"; echo ${1} ${1#*\*}'
146docommand param62 "$SHELL -c '$cmd'" 0 "abab*cbb cbb\n" ""
147
148cmd='set -- "abab*cbb"; echo "${1} ${1%\**}"'
149docommand param63 "$SHELL -c '$cmd'" 0 "abab*cbb abab\n" ""
150cmd='set -- "abab*cbb"; echo ${1} ${1%\**}'
151docommand param64 "$SHELL -c '$cmd'" 0 "abab*cbb abab\n" ""
152
153docommand param70 "$SHELL -c 'X=#; VAR=#2345; echo \${VAR#\$X}'" 0 "2345\n" ""
154docommand param71 "$SHELL -c 'X=#; VAR=#2345; echo \${VAR#\${X}}'" 0 "2345\n" ""
155
156
157docommand param80 "$SHELL -c 'set -- a b c d; echo \${4}'" 0 "d\n" ""
158docommand param81 "$SHELL -c 'set -- a b c d; echo \${2147483645}'" 0 "\n" ""
159docommand param82 "$SHELL -c 'set -- a b c d; echo \${2147483646}'" 0 "\n" ""
160docommand param83 "$SHELL -c 'set -- a b c d; echo \${2147483647}'" 0 "\n" ""
161docommand param84 "$SHELL -c 'set -- a b c d; echo \${4294967297}'" 0 "\n" ""
162docommand param85 "$SHELL -c 'set -- a b c d; echo \${4294967297-hello}'" 0 "hello\n" ""
163#
164# End test from Robert Elz <kre@munnari.oz.au>
165#
166
167#
168# Test that set -u does not cause "$@" to fail
169#
170docommand param100 "$SHELL -cu 'echo \"\$@\"'" 0 "\n" ""
171
172#
173# Test left to right parameter evaluation
174#
175docommand param150 "$SHELL -c 'X=BAD; X=OK Z=\$X; echo \$Z'" 0 "OK\n" ""
176docommand param151 "$SHELL -c 'X=OLD Y=\${X=OK} Z=\$X; echo \$X \$Z'" 0 "OLD OLD\n" ""
177docommand param152 "$SHELL -c 'Y=\${X=OK} Z=\$X; echo \$X \$Z'" 0 "OK OK\n" ""
178docommand param153 "$SHELL -c 'Y=\${X:=OK} Z=\$X; echo \$X \$Z'" 0 "OK OK\n" ""
179
180#
181# Test Prefix- and Suffix- parameter expansion with double quotes in the pattern
182#
183docommand param180 "$SHELL -c 'foo=abcdefghij; bar=efg ; echo \${foo%\"\$bar\"*}'" 0 "abcd\n" ""
184docommand param181 "$SHELL -c 'foo=abcdefghij; bar=efg ; echo \${foo%\"\$bar*\"}'" 0 "abcdefghij\n" ""
185docommand param182 "$SHELL -c 'foo=abcdefghij"\\\\\\"e; bar=efg ; echo \${foo%\"\e\"}'" 0 "abcdefghij\n" ""
186docommand param183 "$SHELL -c 'foo=abcdefghij"\\\\\\"e; bar=efg ; echo \${foo%\e}'" 0 "abcdefghij\\\\\n" ""
187docommand param184 "$SHELL -c 'in=\$1; pre=\${1%?}; out=\${in#\"\$pre\"}; printf [%s] \"\$out\"' -- AB\\\"C" 0 "[C]" ""
188
189docommand param200 "$SHELL -c 'a=; printf \"<%s>\" \"\${a:-\"a b\"}\"'" 0 "<a b>" ""
190docommand param201 "$SHELL -c 'x=\"a*b\"; y=\"a[*]b\"; printf \"<%s>\" \"\${x#\$y}\"'" 0 "<>" ""
191docommand param202 "$SHELL -c 'x=\"a*b\"; y=\"a[*]b\"; printf \"<%s>\" \"\${x#\"\$y\"}\"'" 0 "<a*b>" ""
192
193success
194