if [ $2 ]; then echo $2 - Hur!?

Här diskuteras programmering och utveckling
Emil.s
Inlägg: 6633
Blev medlem: 12 dec 2006, 23:20
OS: Ubuntu
Ort: /Dalarna/Hedemora/
Kontakt:

if [ $2 ]; then echo $2 - Hur!?

Inlägg av Emil.s »

Siter och försöker mig på ett litet script. Ska användas för att säkerhetskopiera MySQL databaser senare är det tänkt...

Tanken är att man ska anropa scriptet med t.ex 2 argument, och sen körs samma kommando, men med olika argument (dvs, mysql-dump mod olika databaser).
För tillfället är det dock "echo" som göller för enkelhetens skull. :P

Kod: Markera allt

if [ $1 ]; then
	echo $1
else if [ $2 ]; then
	echo $2
else
	echo 'Ingen databas!'
fi fi
echo $2
Tänkt schema:
1. OM $1 finns, skriv ut värdet, OM $2 finns, skriv även ut det. OM INGET - Skriv ut "Ingen databas"

Men det funkar inte:

Kod: Markera allt

root@sandnabba: /home #> ./test.sh 1 2
1
2
2an skrivs inte ut! Men den finns iallafall där...
Home sweet ~/ = http://sandnabba.se
andol
Inlägg: 3093
Blev medlem: 31 dec 2007, 00:19
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur

Re: if [ $2 ]; then echo $2 - Hur!?

Inlägg av andol »

testet else if utförs endast om tidigare if-test har misslyckats.

Tänk om, tänk rätt :)
Emil.s
Inlägg: 6633
Blev medlem: 12 dec 2006, 23:20
OS: Ubuntu
Ort: /Dalarna/Hedemora/
Kontakt:

Re: if [ $2 ]; then echo $2 - Hur!?

Inlägg av Emil.s »

andol skrev:testet else if utförs endast om tidigare if-test har misslyckats.

Tänk om, tänk rätt :)
Ajaj, det där borde man väl ha kunnat. Dags att sova på nätterna tror jaf. :p

Tack! :)
Home sweet ~/ = http://sandnabba.se
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: if [ $2 ]; then echo $2 - Hur!?

Inlägg av Konservburk »

Se upp med if [ $2 ] ... saknas fnuttar kan det hända att du råkar ut för obehagliga överraskningar.
Emil.s
Inlägg: 6633
Blev medlem: 12 dec 2006, 23:20
OS: Ubuntu
Ort: /Dalarna/Hedemora/
Kontakt:

Re: if [ $2 ]; then echo $2 - Hur!?

Inlägg av Emil.s »

Konservburk skrev:Se upp med if [ $2 ] ... saknas fnuttar kan det hända att du råkar ut för obehagliga överraskningar.
Hm, på vilket sätt menar du!?

Ser förövrigt ut så här nu:

Kod: Markera allt

#!/bin/sh

DATUM="$(date +%Y%m%d-%H%M)"
DESTINATION="./databaser"

if [ ! $1 ]; then
	echo No database found
fi

if [ $1 ]; then
	mysqldump -f --password="XXX" --opt "$1" > $DESTINATION/$1-$DATUM.sql
fi
if [ $2 ]; then
	mysqldump -f --password="XXX" --opt "$2" > $DESTINATION/$2-$DATUM.sql
fi
if [ $3 ]; then
	mysqldump -f --password="XXX" --opt "$3" > $DESTINATION/$3-$DATUM.sql
fi
Är som ni kanske märker lite slö för dagen. Men visst måste det väl gå att få bash att räkna argumenten och plussa på om $X + 1 existerar?
Home sweet ~/ = http://sandnabba.se
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: if [ $2 ]; then echo $2 - Hur!?

Inlägg av Konservburk »

Emil.s skrev:
Konservburk skrev:Se upp med if [ $2 ] ... saknas fnuttar kan det hända att du råkar ut för obehagliga överraskningar.
Hm, på vilket sätt menar du!?
Jag menar att du bör använda if [ -n "$2" ] istället för if [ $2 ] för att inte riskera att det blir fel ifall $2 råkar vara något mindre genomtänkt.
Emil.s skrev:Är som ni kanske märker lite slö för dagen. Men visst måste det väl gå att få bash att räkna argumenten och plussa på om $X + 1 existerar?
Jag är inte riktigt med på vad du menar här?
Du kan "räkna" argumenten med $#, men vad vill du "plussa på"?

Men med tanke på hur ditt skript ser ut så skulle du kunna använda en for-loop:

Kod: Markera allt

test $# -eq 0 &&
echo No database found

for i
do mysqldump -f --password="XXX" --opt "$i" >"$DESTINATION/$i-$DATUM.sql"
done
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: if [ $2 ]; then echo $2 - Hur!?

Inlägg av David Andersson »

Emil.s skrev:

Kod: Markera allt

if [ ! $1 ]; then
	echo No database found
fi

if [ $1 ]; then
	mysqldump -f --password="XXX" --opt "$1" > $DESTINATION/$1-$DATUM.sql
fi
if [ $2 ]; then
	mysqldump -f --password="XXX" --opt "$2" > $DESTINATION/$2-$DATUM.sql
fi
if [ $3 ]; then
	mysqldump -f --password="XXX" --opt "$3" > $DESTINATION/$3-$DATUM.sql
fi
I stället för [ ! $1 ] för att se om $1 är tom eller odefinierad kan man testa med -z (eller ! -n). Att tolka vilket värde som helst som boolean på ovanstående sätt kan bli väldigt fel om värdet ser ut som en operator (t.ex börjar med minus) eller om det innehåller space. Därför också citat runt $1. Alltså, första testet kan skrivas [ -z "$1" ]. Alternativt ha ett test som kollar antal argumenten [ $# -eq 0 ].

Felmeddelandet "No database found" kan feltolkas. Programmet har ännu inte kollat om nån databas finns, och användaren har inte angivit nån databas som programmet försökt hitta. Felet är att ett obligatorisk argument på kommandoraden saknas. Har ändrat till "Missing argument" nedan. Vanligen avlutar man program med en status skild från 0 när man upptäcker fel.

I stället för att upprepa med $1, $2, $3 kan du loopa direkt över argumenten: for f in "$@". Har även placerat $f inom citat på alla ställen nedan.

Kod: Markera allt

if [ -z "$1" ]; then
    echo "Missing argument: database name(s)"
    exit 1
fi

for f in "$@"; do
    mysqldump -f --password="XXX" --opt "$f" > $DESTINATION/"$f"-$DATUM.sql
done
EDIT: som Konservburk tydligen redan förklarat. Men felmeddelandet kan jag väl få äran för :)
Emil.s
Inlägg: 6633
Blev medlem: 12 dec 2006, 23:20
OS: Ubuntu
Ort: /Dalarna/Hedemora/
Kontakt:

Re: if [ $2 ]; then echo $2 - Hur!?

Inlägg av Emil.s »

Se där ja. Tackar för de utförliga förklaringarna av er båda! :)
Home sweet ~/ = http://sandnabba.se
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: if [ $2 ]; then echo $2 - Hur!?

Inlägg av Konservburk »

David Andersson skrev:I stället för att upprepa med $1, $2, $3 kan du loopa direkt över argumenten: for f in "$@".
Om någon undrar så loopar for-satser som standard just direkt över argumenten, varför det går att utelämna in "$@" helt och hållet (vilket var vad jag av gammal vana gjorde i mitt exempel).
Skriv svar

Återgå till "Programmering och webbdesign"