#!/bin/sh echo T.clv: check command-line variables awk=${awk-../a.out} rm -f core # stdin only, no cmdline asgn echo 'hello goodbye' | $awk ' BEGIN { x=0; print x; getline; print x, $0 } ' >foo1 echo '0 0 hello' >foo2 diff foo1 foo2 || echo 'BAD: T.clv (stdin only)' # cmdline asgn then stdin echo 'hello goodbye' | $awk ' BEGIN { x=0; print x; getline; print x, $0 } ' x=1 >foo1 echo '0 1 hello' >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=1 only)' # several cmdline asgn, then stdin echo 'hello goodbye' | $awk ' BEGIN { x=0; print x; getline; print x, $0 } ' x=1 x=2 x=3 >foo1 echo '0 3 hello' >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=3 only)' # several cmdline asgn, then file echo 'hello goodbye' >foo $awk ' BEGIN { x=0; print x; getline; print x, $0 } ' x=1 x=2 x=3 foo >foo1 echo '0 3 hello' >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=3 only)' # cmdline asgn then file echo 4 >foo1 $awk 'BEGIN { getline; print x}' x=4 /dev/null >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=4 /dev/null)' #cmdline asgn then file but no read of it echo 0 >foo1 $awk 'BEGIN { x=0; getline <"/dev/null"; print x}' x=5 /dev/null >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=5 /dev/null)' #cmdline asgn then file then read echo 'xxx yyy zzz' >foo echo '6 end' >foo1 $awk 'BEGIN { x=0; getline; print x} END { print x }' x=6 foo x=end >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=6 /dev/null)' #cmdline asgn then file then read echo '0 end' >foo1 $awk 'BEGIN { x=0; getline <"/dev/null"; print x} END { print x }' x=7 /dev/null x=end >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=7 /dev/null)' #cmdline asgn then file then read; _ in commandname echo '0 end' >foo1 $awk 'BEGIN { _=0; getline <"/dev/null"; print _} END { print _ }' _=7A /dev/null _=end >foo2 diff foo1 foo2 || echo 'BAD: T.clv (_=7A /dev/null)' # illegal varname in commandname $awk '{ print }' 99_=foo /dev/null >foo 2>foo2 grep "can't open.*foo" foo2 >/dev/null 2>&1 || echo 'BAD: T.clv (7B: illegal varname)' # these test the new -v option: awk ... -v a=1 -v b=2 'prog' does before BEGIN echo 123 >foo1 $awk -v x=123 'BEGIN { print x }' >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=11)' echo 123 >foo1 $awk -vx=123 'BEGIN { print x }' >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=11a)' echo 123 abc 10.99 >foo1 $awk -v x=123 -v y=abc -v z1=10.99 'BEGIN { print x, y, z1 }' >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=12)' echo 123 abc 10.99 >foo1 $awk -vx=123 -vy=abc -vz1=10.99 'BEGIN { print x, y, z1 }' >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=12a)' echo 123 abc 10.99 >foo1 $awk -v x=123 -v y=abc -v z1=10.99 -- 'BEGIN { print x, y, z1 }' >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=12a)' echo 'BEGIN { print x, y, z1 }' >foo0 echo 123 abc 10.99 >foo1 $awk -v x=123 -v y=abc -f foo0 -v z1=10.99 >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=13)' echo 'BEGIN { print x, y, z1 }' >foo0 echo 123 abc 10.99 >foo1 $awk -vx=123 -vy=abc -f foo0 -vz1=10.99 >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=13a)' echo 'BEGIN { print x, y, z1 }' >foo0 echo 123 abc 10.99 >foo1 $awk -f foo0 -v x=123 -v y=abc -v z1=10.99 >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=14)' echo 'BEGIN { print x, y, z1 }' >foo0 echo 123 abc 10.99 >foo1 $awk -f foo0 -vx=123 -vy=abc -vz1=10.99 >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=14a)' echo 'BEGIN { print x, y, z1 } END { print x }' >foo0 echo '123 abc 10.99 4567' >foo1 $awk -f foo0 -v x=123 -v y=abc -v z1=10.99 /dev/null x=4567 /dev/null >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=15)' echo 'BEGIN { print x, y, z1 } END { print x }' >foo0 echo '123 abc 10.99 4567' >foo1 $awk -f foo0 -vx=123 -vy=abc -vz1=10.99 /dev/null x=4567 /dev/null >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=15a)' echo 'BEGIN { print x, y, z1 } NR==1 { print x }' >foo0 echo '123 abc 10.99 4567' >foo1 $awk -v x=123 -v y=abc -v z1=10.99 -f foo0 x=4567 /etc/passwd >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=16)' echo 'BEGIN { print x, y, z1 } NR==1 { print x }' >foo0 echo '123 abc 10.99 4567' >foo1 $awk -vx=123 -vy=abc -vz1=10.99 -f foo0 x=4567 /etc/passwd >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=16a)' # special chars in commandline assigned value; # have to use local echo to avoid quoting problems. ./echo 'a\\b\z' >foo1 ./echo 'hello' | $awk '{print x}' x='\141\\\\\142\\z' >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=17)' ./echo "a z" >foo1 ./echo 'hello' | $awk '{print x}' x='a\nz' >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=18)' # a bit circular here... $awk 'BEGIN { printf("a%c%c%cz\n", "\b", "\r", "\f") }' >foo1 ./echo 'hello' | $awk '{print x}' x='a\b\r\fz' >foo2 diff foo1 foo2 || echo 'BAD: T.clv (x=19)' ### newer -v tests $awk -vx 'BEGIN {print x}' >foo 2>&1 grep 'invalid -v option argument: x' foo >/dev/null || echo 'BAD: T.clv (x=20)' $awk -v x 'BEGIN {print x}' >foo 2>&1 grep 'invalid -v option argument: x' foo >/dev/null || echo 'BAD: T.clv (x=20a)'