sslug-teknik team mailing list archive
-
sslug-teknik team
-
Mailing list archive
-
Message #95352
Jeg forstår ikke denne bash-script særhed
Jeg har nu siddet og revet håret ud af ansigtet i et par timer over en
fejl i et shellscript, som jeg kan lokalisere kilden til, men ikke forstå
årsagen - så nu prøver jeg at se om nogen af jer kan lure den (eller om
det er noget helt banalt som jeg har overset efter alt for mange timer på
skrivebordsstolen).
Scriptet spiser filerne der er angivet i INPUTS listen. Disse er som vist
herunder.
Når jeg kører det så opnår jeg at min funktion "runtest" opfører sig
anderledes alt efter om kaldet til den pipes ind i cat eller ej -
demonstreret ved output fra første og andet for-loop. Den virker altså
kun efter hensigten når jeg piper den ind i "noget andet". Konkret er det
"getopts" der fejler uden pipe'n - og der bliver ikke udskrevet hvilket
username config linjen indeholder.
Men hvorfor opfører getopts sig anderledes i de to tilfælde?
Forsøget er kørt i bash 3.2.17 på MacOS og i bash 3.2.25 på Ubuntu.
Hvis nogen kan vise mig lyset kommer I med i alle de aftenbønner jeg
beder resten af ugen!
MvhKenneth
Inputfiler (i samme dir som script):Filnavn metatest-1.sql:-- Køres på
stadsdb, integrationsskema-- testconfig: user=integration
begin select * from dual;end;/Slut på inputfil 1.
Filnavn metatest-2.sql:
-- Køres på stadsdb, integrationsskema-- testconfig: user=superuser
begin select * from dual;end;/Slut på inputfil 2.
Scriptet kommer her:
#!/bin/bash
INPUTS=( 'metatest-1.sql' 'metatest-2.sql' 'metatest-1.sql'
'metatest-1.sql' 'metatest-2.sql' 'metatest-2.sql'
)
SEDCMD='sed -re'if [ -n "`uname -a | grep -o Darwin`" ]then SEDCMD='sed
-Ee'fi
function my_basename() { if $IS_MACOS then echo `basename -s $2 $1` else
echo `basename $1 $2` fi}
function runtest() { echo "" TEST2RUN=$1 CFGLINE=`grep -E ^--\
?testconfig ${TEST2RUN} | $SEDCMD 's/^-- ?testconfig: ?//'` CFGLINE=`echo
$CFGLINE | $SEDCMD 's/user=/-u/'` echo "TEST2RUN=${TEST2RUN}" echo
"CFGLINE=${CFGLINE}" while getopts "u:p:s:" key ${CFGLINE} do if [ "$key"
= "u" ] then case "$OPTARG" in "integration") echo "Fandt
user=integration" ;; "superuser" ) echo "Fandt user=superuser" ;; * )
echo "No such user: $OPTARG" exit 1 ;; esac fi done}
echo "Loopet med pipe til cat virker fint"for each in "${INPUTS[@]}"do
runtest $each | catdone
echo ""echo "Loopet uden pipe virker ikke"for each in "${INPUTS[@]}"do
runtest $eachdone
Follow ups