Sida 1 av 1

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

Postat: 23 jan 2009, 19:01
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...

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

Postat: 23 jan 2009, 19:05
av andol
testet else if utförs endast om tidigare if-test har misslyckats.

Tänk om, tänk rätt :)

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

Postat: 23 jan 2009, 19:17
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! :)

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

Postat: 23 jan 2009, 19:22
av Konservburk
Se upp med if [ $2 ] ... saknas fnuttar kan det hända att du råkar ut för obehagliga överraskningar.

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

Postat: 23 jan 2009, 23:40
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?

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

Postat: 24 jan 2009, 00:19
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

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

Postat: 24 jan 2009, 00:23
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 :)

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

Postat: 24 jan 2009, 00:36
av Emil.s
Se där ja. Tackar för de utförliga förklaringarna av er båda! :)

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

Postat: 24 jan 2009, 00:58
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).