webForumDet fria alternativet

test av argument med wildcard

5 svar · 668 visningar · startad av noratx

noratxMedlem sedan feb. 200193 inlägg
#1

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
#2

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
#3

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
#4

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
#5

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
#6

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 :)

576 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
574 ms — hämta tråd, inlägg och bilagor (db)