noratxMedlem sedan feb. 200193 inlägg Jag försöker få till ett test av ett argument.
Vid körande av mitt script, vill jag kontrollera om andra argumentet innehåller *.gz, där * är ett wildcard.
(Exempel på input: "mybackup.sh -send backup.sql.gz")
Det finns andra argument, som tex: "mybackup.sh -dump -send"
I det senare fallet sätts en variabel (dumpfile) till full_dump_(datum).sql.gz, när -dump har gjort sitt, tar -send vid och skickar iväg dumpfilen.
Men låt oss säga att FTP servern som tar emot dumpfilen för tillfället inte svarar, då vill jag kunna köra -send ensamt. I det fallet vet ju scriptet inte om vad dumpfilen heter, och därfor vill jag testa om andra argumentet innehåller "*.gz", så variabeln dumpfile får ett värde.
Den lösningen jag kommit på för detta är följande:
if [ $2 = *.gz ] ;
then
dumpfile="$2"
fi
Problemet är ju bara att
if [ $2 = *.gz ] :
tycker att andra argumentet skall vara just "*.gz" annars blir det fel. Hur löser jag detta på bästa sätt?
spangoMedlem sedan juni 20008 205 inlägg Om man skickar -q till grep, så är den "tyst" och svarar bara på om insträngen matchade eller inte. Så du skulle kunna kombinera det med regexp-switchen -P:
if echo "$2" | grep -q -P '\.gz$'; then dumpfile="$2"; fi
Typ. Kan inte svära på att regexpen funkar; om den inte gör det, testa lite utan -q.
noratxMedlem sedan feb. 200193 inlägg Hej!
Det dar gav mig lite olika fel som jag inte riktigt forstar mig pa.
if echo "$2" | grep -q -P '\.gz$';
then
echo "The file is a .gzip file"
else
echo "Error!"
fi
Bara for att testa scriptet sa gor jag echoes.
Har ar felen jag far:
itsak# ./test.sh arg1 arg2.gz
if: Expression Syntax.
grep: The -P option is not supported
then: Command not found.
The file is a .gzip file
else: endif not found.
spangoMedlem sedan juni 20008 205 inlägg Prova med -E istället för -P. Och så måste antagligen grep-grejen ligga i ett subshell, så
if (echo "$2" | grep -q -E '\.gz$') ;
then
echo "The file is a .gzip file"
else
echo "Error!"
fi
noratxMedlem sedan feb. 200193 inlägg Hmm.. nu fungerade det lite battre.
Felen reducerade till enbart ett enda.
itsak# ./test.sh arg1 arg2.gz
if: Expression Syntax.
Provade att byta ut parenteserna mot hakklammrar, men det gav samma resultat.
spangoMedlem sedan juni 20008 205 inlägg Mysko, det funkar för mig i bash. Vad kör du för skal?
Hakparanteserna ska du inte använda, de är bara en sockrad version av kommandot test (så [ -eq $a $b ] är samma lika som test -eq $a $b). Vanliga paranteser gör ett subskal av flera kommandon, och det subskalet får samma avslutningskod som det sista kommandot i subskalet. Stor skillnad :)