On Wed, 3 Aug 2005, Dave Anderson wrote: > Something's screwy here, using the 'set -A' command in /bin/sh on > 3.7-release. AFAICT the complicated file-match expression should (in > this case) produce the same results as the simple one, but it doesn't > seem to match at all when used in this script -- but does produce the > expected result when cut-and-pasted to a command line. > > Any constructive comments would be greatly appreciated.
I do not understand this yet, but the desired behaviour is achieved if you force the file name matching to be done in the call: #!/bin/sh function DoIt { set -A files $* echo "match = '$1'" typeset -i idx idx=0 while [ idx -lt ${#files[*]} ] ; do echo "files[$idx] = '${files[$idx]}'" idx=idx+1 done return 0 } DoIt /tmp/tst/* echo "" DoIt /tmp/tst/+([a-zA-Z])+([0-9]).@(in|out).@(block|pass).@(destIP|destPort|srcIP) $ sh x match = '/tmp/tst/ne3.in.block.destIP' files[0] = '/tmp/tst/ne3.in.block.destIP' files[1] = '/tmp/tst/ne3.in.block.destPort' files[2] = '/tmp/tst/ne3.in.block.srcIP' match = '/tmp/tst/ne3.in.block.destIP' files[0] = '/tmp/tst/ne3.in.block.destIP' files[1] = '/tmp/tst/ne3.in.block.destPort' files[2] = '/tmp/tst/ne3.in.block.srcIP' Alternatively, adding an 'eval' before the 'set' command also fixes the problem: #!/bin/sh function DoIt { eval set -A files $1 echo "match = '$1'" typeset -i idx idx=0 while [ idx -lt ${#files[*]} ] ; do echo "files[$idx] = '${files[$idx]}'" idx=idx+1 done return 0 } DoIt "/tmp/tst/*" echo "" DoIt "/tmp/tst/+([a-zA-Z])+([0-9]).@(in|out).@(block|pass).@(destIP|destPort|srcIP)" -Otto