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