1#!/bin/bash
2
3if [[ -z "$AWK" || -z "$WORKDIR" ]]; then
4    printf '$AWK and $WORKDIR must be set\n' >&2
5    exit 1
6fi
7
8TEMP0=$WORKDIR/test.temp.0
9TEMP1=$WORKDIR/test.temp.1
10TEMP2=$WORKDIR/test.temp.2
11
12RESULT=0
13
14fail() {
15	echo "$1" >&2
16	RESULT=1
17}
18
19echo T.clv: check command-line variables
20
21rm -f core
22
23# stdin only, no cmdline asgn
24echo 'hello
25goodbye' | $AWK '
26BEGIN { x=0; print x; getline; print x, $0 }
27' > $TEMP1
28echo '0
290 hello' > $TEMP2
30diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (stdin only)'
31
32# cmdline asgn then stdin
33echo 'hello
34goodbye' | $AWK '
35BEGIN { x=0; print x; getline; print x, $0 }
36' x=1 > $TEMP1
37echo '0
381 hello' > $TEMP2
39diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=1 only)'
40
41# several cmdline asgn, then stdin
42echo 'hello
43goodbye' | $AWK '
44BEGIN { x=0; print x; getline; print x, $0 }
45' x=1 x=2 x=3 > $TEMP1
46echo '0
473 hello' > $TEMP2
48diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=3 only)'
49
50# several cmdline asgn, then file
51echo 'hello
52goodbye' > $TEMP0
53$AWK '
54BEGIN { x=0; print x; getline; print x, $0 }
55' x=1 x=2 x=3 $TEMP0 > $TEMP1
56echo '0
573 hello' > $TEMP2
58diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=3 only)'
59
60# cmdline asgn then file
61echo 4 > $TEMP1
62$AWK 'BEGIN { getline; print x}' x=4 /dev/null > $TEMP2
63diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=4 /dev/null)'
64
65#cmdline asgn then file but no read of it
66echo 0 > $TEMP1
67$AWK 'BEGIN { x=0; getline <"/dev/null"; print x}' x=5 /dev/null > $TEMP2
68diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=5 /dev/null)'
69
70#cmdline asgn then file then read
71echo 'xxx
72yyy
73zzz' > $TEMP0
74echo '6
75end' > $TEMP1
76$AWK 'BEGIN { x=0; getline; print x}
77      END { print x }' x=6 $TEMP0 x=end > $TEMP2
78diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=6 /dev/null)'
79
80#cmdline asgn then file then read
81echo '0
82end' > $TEMP1
83$AWK 'BEGIN { x=0; getline <"/dev/null"; print x}
84      END { print x }' x=7 /dev/null x=end > $TEMP2
85diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=7 /dev/null)'
86
87#cmdline asgn then file then read; _ in commandname
88echo '0
89end' > $TEMP1
90$AWK 'BEGIN { _=0; getline <"/dev/null"; print _}
91      END { print _ }' _=7A /dev/null _=end > $TEMP2
92diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (_=7A /dev/null)'
93
94# illegal varname in commandname
95$AWK '{ print }' 99_=$TEMP0 /dev/null > $TEMP0 2> $TEMP2
96grep "can't open.*test.temp.0" $TEMP2 >/dev/null 2>&1 || fail 'BAD: T.clv (7B: illegal varname)'
97
98# these test the new -v option:  awk ... -v a=1 -v b=2 'prog' does before BEGIN
99
100echo 123 > $TEMP1
101$AWK -v x=123 'BEGIN { print x }' > $TEMP2
102diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=11)'
103
104echo 123 > $TEMP1
105$AWK -vx=123 'BEGIN { print x }' > $TEMP2
106diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=11a)'
107
108echo 123 abc 10.99 > $TEMP1
109$AWK -v x=123 -v y=abc -v z1=10.99 'BEGIN { print x, y, z1 }' > $TEMP2
110diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=12)'
111
112echo 123 abc 10.99 > $TEMP1
113$AWK -vx=123 -vy=abc -vz1=10.99 'BEGIN { print x, y, z1 }' > $TEMP2
114diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=12a)'
115
116echo 123 abc 10.99 > $TEMP1
117$AWK -v x=123 -v y=abc -v z1=10.99 -- 'BEGIN { print x, y, z1 }' > $TEMP2
118diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=12a)'
119
120echo 'BEGIN { print x, y, z1 }' > $TEMP0
121echo 123 abc 10.99 > $TEMP1
122$AWK -v x=123 -v y=abc -f $TEMP0 -v z1=10.99 > $TEMP2
123diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=13)'
124
125echo 'BEGIN { print x, y, z1 }' > $TEMP0
126echo 123 abc 10.99 > $TEMP1
127$AWK -vx=123 -vy=abc -f $TEMP0 -vz1=10.99 > $TEMP2
128diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=13a)'
129
130echo 'BEGIN { print x, y, z1 }' > $TEMP0
131echo 123 abc 10.99 > $TEMP1
132$AWK -f $TEMP0 -v x=123 -v y=abc -v z1=10.99 > $TEMP2
133diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=14)'
134
135echo 'BEGIN { print x, y, z1 }' > $TEMP0
136echo 123 abc 10.99 > $TEMP1
137$AWK -f $TEMP0 -vx=123 -vy=abc -vz1=10.99 > $TEMP2
138diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=14a)'
139
140echo 'BEGIN { print x, y, z1 }
141END { print x }' > $TEMP0
142echo '123 abc 10.99
1434567' > $TEMP1
144$AWK -f $TEMP0 -v x=123 -v y=abc -v z1=10.99 /dev/null x=4567 /dev/null > $TEMP2
145diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=15)'
146
147echo 'BEGIN { print x, y, z1 }
148END { print x }' > $TEMP0
149echo '123 abc 10.99
1504567' > $TEMP1
151$AWK -f $TEMP0 -vx=123 -vy=abc -vz1=10.99 /dev/null x=4567 /dev/null > $TEMP2
152diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=15a)'
153
154echo 'BEGIN { print x, y, z1 }
155NR==1 { print x }' > $TEMP0
156echo '123 abc 10.99
1574567' > $TEMP1
158$AWK -v x=123 -v y=abc -v z1=10.99 -f $TEMP0 x=4567 /etc/passwd > $TEMP2
159diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=16)'
160
161echo 'BEGIN { print x, y, z1 }
162NR==1 { print x }' > $TEMP0
163echo '123 abc 10.99
1644567' > $TEMP1
165$AWK -vx=123 -vy=abc -vz1=10.99 -f $TEMP0 x=4567 /etc/passwd > $TEMP2
166diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=16a)'
167
168
169
170# special chars in commandline assigned value;
171# have to use local echo to avoid quoting problems.
172
173cat <<< 'a\\b\z' > $TEMP1
174echo 'hello' | $AWK '{print x}' x='\141\\\\\142\\z' > $TEMP2
175diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=17)'
176
177echo "a
178z" > $TEMP1
179echo 'hello' | $AWK '{print x}' x='a\nz' > $TEMP2
180diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=18)'
181
182# a bit circular here...
183$AWK 'BEGIN { printf("a%c%c%cz\n", "\b", "\r", "\f") }' > $TEMP1
184echo 'hello' | $AWK '{print x}' x='a\b\r\fz' > $TEMP2
185diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=19)'
186
187echo '\' > $TEMP1
188$AWK -v 'x=\' 'BEGIN { print x; }' > $TEMP2
189diff $TEMP1 $TEMP2 || fail 'BAD: T.clv (x=\)'
190
191### newer -v tests
192
193
194$AWK -vx 'BEGIN {print x}' > $TEMP1 2>&1
195grep 'invalid -v option argument: x' $TEMP1 >/dev/null || fail 'BAD: T.clv (x=20)'
196
197$AWK -v x 'BEGIN {print x}' > $TEMP1 2>&1
198grep 'invalid -v option argument: x' $TEMP1 >/dev/null || fail 'BAD: T.clv (x=20a)'
199
200
201exit $RESULT
202