o to horší to je, že tobě to funguje. Bash zatím docela boří moje znalosti a zvyky programování, což mi nedělá dobře.
Takže pošlu příklad skript, je delší, ale důležitých je jen pár posledních řádků kolem ifu. Asi nebude napsán optimálně, ale žádný div. V bashi jsem toho moc nenaprogramoval.
#!/bin/bash
function printUsageAndExit {
echo "Usage: checkFileForWrongIndentation.sh [-v] FILE";
echo;
echo "when swith -v is used then all lines with error is reported, otherwise only report that supplied file is not correct is reported."
exit 1;
}
function testFileExistency {
if [ ! -e "$1" ]; then
printUsageAndExit;
fi
}
LINE_NUMBER=0;
if [ $# -eq 0 -o $# -gt 2 ]; then
printUsageAndExit;
fi
if [ $# -eq 1 ]; then
testFileExistency "$1"
FILE="$1";
VERBOSE=1;
else
#from here on we know, that two parameters were supplied, so we just check for -v switch presence
testFileExistency "$2"
FILE="$2";
if [ "$1" = "-v" ]; then
VERBOSE=0;
else
printUsageAndExit
fi
fi
cat "$FILE" | sed "s/^\([ \t]*\).*$/\"\1\"/" | sed "s/\t//g" | while read LINE; do
#echo "$LINE" | tr -d "\n" | wc -m | tr -d "\n"; echo ": \"$LINE\""
LINE_NUMBER=$(($LINE_NUMBER + 1));
SPACES=`echo -n "$LINE" | wc -m | tr "\n" " "`;
SPACES=$(($SPACES - 2));
if [ $SPACES -gt 3 ]; then
if [ $VERBOSE -eq 0 ]; then
echo "wrong indentation in file \"$FILE\" on line $LINE_NUMBER";
ERROR_FOUND=1;
else
echo "File $FILE has badly indented lines";
echo trying to quit;
exit 1;
echo failed;
#break;
fi
fi
done;
echo hmm
výstup:
File testingDir/SecurityUtil.java has badly indented lines
trying to quit
hmm
komentář: testingDir/SecurityUtil.java je soubor, který byl specifikován jako parametr. Je vidět, že exit skutečně něco udělal protože "failed" se nevypsalo, ale ZJEVNĚ nezpůsobil ukončení skriptu protože se vypíše "hmm" a protože se "hmm" vypíše korektně, pak je $? roven nule. Co je však zajímavější je to, že exit skutečně nastaví $? na 1, protože když výpis "hmm" zakomentuji, dostanu po provedení skritpu v $? jedničku. Proč tedy toto chování? Jaká je příčina, že tvůj exit ukončí skript a můj exist ne?
A jak je to s těmi proměnnými? Skutečně, když jsem v místě kde je teď exit (ten v cyklu) nastavil hodnotu nějaké proměnné, pak v místě výpisu "hmm" měla původní hodnotu - vypadá to, jako kdyby cyklus byl implemen uvnitř nějaké metody a veškeré parametry se mu předávají hodnotou (nemyslím paskalovskou "hodnotou", která je ve skutečnosti "hodnotou-výsledkem")