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 11TEMP3=$WORKDIR/test.temp.3 12TEMP4=$WORKDIR/test.temp.4 13TEMP5=$WORKDIR/test.temp.5 14 15RESULT=0 16 17fail() { 18 echo "$1" >&2 19 RESULT=1 20} 21 22echo T.argv: misc tests of argc and argv 23 24echo > $TEMP1 25echo > $TEMP2 26$AWK ' 27BEGIN { 28 for (i = 1; i < ARGC-1; i++) 29 printf "%s ", ARGV[i] 30 if (ARGC > 1) 31 printf "%s", ARGV[i] 32 printf "\n" 33 exit 34}' * > $TEMP1 35echo * > $TEMP2 36diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (echo1 *)' 37 38$AWK ' 39BEGIN { 40 for (i = 1; i < ARGC; i++) { 41 printf "%s", ARGV[i] 42 if (i < ARGC-1) 43 printf " " 44 } 45 printf "\n" 46 exit 47}' * > $TEMP1 48echo * > $TEMP2 49diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (echo2 *)' 50 51$AWK ' 52BEGIN { 53 print ARGC 54 ARGV[ARGC-1] = "" 55 for (i=0; i < ARGC; i++) 56 print ARGV[i] 57 exit 58} 59' a bc def gh > $TEMP1 60echo "5 61$AWK 62a 63bc 64def 65" > $TEMP2 66diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (argc *)' 67 68echo '1 692 703' > $TEMP0 71echo 'foo1 72foo2 73foo3' > $TEMP1 74$AWK '{print L $0}' L=foo <$TEMP0 > $TEMP2 75diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (L=foo <test.temp.1)' 76 77echo '1 782 793' > $TEMP0 80echo 'foo1 81foo2 82foo3' > $TEMP1 83$AWK '{print L $0}' L=foo $TEMP0 > $TEMP2 84diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (L=foo test.temp.1)' 85 86echo '1 872 883' > $TEMP0 89echo 'foo1 90foo2 91foo3' > $TEMP1 92cat $TEMP0 | $AWK '{print L $0}' L=foo - > $TEMP2 93diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (L=foo -)' 94 95echo '1 962 973' > $TEMP0 98echo 'foo1 99foo2 100foo3 101glop1 102glop2 103glop3' > $TEMP1 104$AWK '{print L $0}' L=foo $TEMP0 L=glop $TEMP0 > $TEMP2 105diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (L=foo L=glop)' 106 107echo '1 1082 1093' > $TEMP0 110echo '111 111112 112113 113221 114222 115223' > $TEMP1 116$AWK '{print L $0}' L=11 $TEMP0 L=22 $TEMP0 > $TEMP2 117diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (L=11 L=22)' 118 119echo 3.345 > $TEMP1 120$AWK 'BEGIN { print ARGV[1] + ARGV[2]}' 1 2.345 > $TEMP2 121diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (ARGV[1] + ARGV[2])' 122 123echo 3.345 > $TEMP1 124x1=1 x2=2.345 $AWK 'BEGIN { print ENVIRON["x1"] + ENVIRON["x2"]}' 1 2.345 > $TEMP2 125diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (ENVIRON[x1] + ENVIRON[x2])' 126 127 128echo 'test.temp.1' > $TEMP1 129echo 'test.temp.2' > $TEMP2 130echo 'test.temp.3' > $TEMP3 131$AWK 'BEGIN { ARGV[2] = "" } 132 { print }' $TEMP1 $TEMP2 $TEMP3 > $TEMP4 133echo 'test.temp.1 134test.temp.3' > $TEMP5 135diff $TEMP4 $TEMP5 || fail 'BAD: T.argv zap ARGV[2]' 136 137echo hi > $TEMP1 ; mv $TEMP1 $TEMP2 138$AWK 'BEGIN { ARGV[1] = "'$TEMP2'" ; print FILENAME } 139 { print FILENAME }' $TEMP1 > $TEMP3 140echo " 141$TEMP2" > $TEMP4 142diff $TEMP3 $TEMP4 || fail 'BAD: T.argv startup FILENAME' 143 # assumes that startup FILENAME is "" 144 145 146# test data balanced on pinhead... 147echo "ARGV[3] is /dev/null 148ARGV[0] is $AWK 149ARGV[1] is /dev/null" > $TEMP1 150 151$AWK 'BEGIN { # this is a variant of arnolds original example 152 ARGV[1] = "/dev/null" 153 ARGV[2] = "glotch" # file open must skipped deleted argv 154 ARGV[3] = "/dev/null" 155 ARGC = 4 156 delete ARGV[2] 157} 158# note that input is read here 159END { 160 for (i in ARGV) 161 printf("ARGV[%d] is %s\n", i, ARGV[i]) 162}' > $TEMP2 163diff $TEMP1 $TEMP2 || fail 'BAD: T.argv delete ARGV[2]' 164 165exit $RESULT 166