PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Faehigkeiten der bash



pibi
19.03.14, 20:51
Hallo zusammen

Bekanntlich kan man ja mit der bash viele geniale Sachen erledigen. So zum Beispiel:
pit@myserv:~> ls -la eins{1.1,2.2,3.3}
ls: cannot access eins1.1: No such file or directory
ls: cannot access eins2.2: No such file or directory
ls: cannot access eins3.3: No such file or directory
pit@myserv:~>Wenn ich nun aber anstelle des bash-internen Befehls "ls" ein Script aufrufen moechte und ihm diese drei Parameter nacheinander mitgegeben moechte, wird immer nur das erste Argument uebergeben, naemlich "1.1".

Was mache ich falsch?

Gruss Pit.

TheDarkRose
19.03.14, 20:54
Wie sieht dein Script aus?

pibi
19.03.14, 21:07
Okay, okay, ich dachte schon, dass abstrahieren wenig sinnvoll ist. Also im Klartext. Bisher machte ich ein
./rsync_suse_update 12.2; ./rsync_suse_update 12.3; ./rsync_suse_update 13.1um mir die Updates auf meinen lokalen Mirror zu holen. Der Inhalt von "rsync_suse_update" ist folgender:
#!/bin/bash
Server="ftp5.gwdg.de"

ServerDir="pub/opensuse/update"

if [ x$1 == "x" ]
then
echo Usage: `basename $0` version
echo eg. version=13.1
exit
fi

DestDir="/mirror/suseupdate/i386/update"

if [ x$1 == "x12.2" ]; then
DestDir="/misc/syno-vol1/mirror/suseupdate/i386/update"

fi

if [ x$1 == "x12.3" ]; then
DestDir="/misc/syno-vol1/mirror/suseupdate/i386/update"

fi

if [ x$1 == "x13.1" ]; then
DestDir="/misc/syno-vol1/mirror/suseupdate/i386/update"

fi

RsyOpts="-av --delete --delete-excluded --backup --backup-dir=$DestDir/$1.backup --exclude-from=/home/pit/rsync_suse.excluded"

echo "rsync $RsyOpts $Server::$ServerDir/$1/ $DestDir/$1"
rsync $RsyOpts $Server::$ServerDir/$1/ $DestDir/$1

Gruss Pit.

pibi
19.03.14, 21:13
Nachtrag:
Und ein
./rsync_suse_update {12.2,12.3,13.1}aktualisiert nur Version 12.2.

Gruss Pit.

marce
19.03.14, 21:24
Frage: Was übergibt denn die Bash bei Deinem Aufruf von oben als Parameter an das Script?

TheDarkRose
19.03.14, 21:30
Klar wenn du nur das erste Argument auswertest ;) Die Bash Completion erweitert dein

./rsync_suse_update {12.2,12.3,13.1}
zu mehreren Argumenten, nicht zu mehrere Aufrufe:

./rsync_suse_update 12.2 12.3 13.1

Ergo musst du durch deine Argumentliste durchloopen um alles auszuführen.

pibi
19.03.14, 21:36
Zusaetzliche Zeile eingefuegt in mein Script:
echo "parm1 ist $1"
Beim ersten und einzigsten Aufruf wird "12.2" ausgegeben.

Gruss Pit.

marce
19.03.14, 21:39
naja, nachdem die Lösung nun quasi schon da steht noch ein wenig Lektüre:

http://www.linux-praxis.de/linux1/shell2_4.html

pibi
19.03.14, 21:51
Danke Dir fuer den Link. Ich bin davon ausgegangen, dass fuer jeden angegebenen Parameter der Befehl oder das Script neu aufgerufen wird. Nun ist es klar, dass ich mein Script umbauen muss (Loop ueber alle uebergebenen Parameter) oder weiterhin mit der "so-machen-es-alle-die-es nicht-besser-wissen"-Loesung leben kann oder will.

Gruss Pit.

marce
19.03.14, 22:04
Ich bin davon ausgegangen, dass fuer jeden angegebenen Parameter der Befehl oder das Script neu aufgerufen wird.
Öhm, sorry, daß ich das so direkt sage, aber irgendwie passt das mit
Registriert seit: Jul 2002nicht so recht zusammen... :-)

pibi
20.03.14, 10:38
Warum? Ich habe kein Problem damit, niemand ist perfekt. Manchmal sieht man den Wald vor lauter Baeumen nicht. Und ich muss leider gestehen, dass ich die Antwort #6 von TheDarkRose vollkommen uebersehen habe.

Gruss Pit.

Efraim
20.03.14, 14:55
Fähigkeiten der Bash Anno 2014:


#!/bin/bash
if [ ! "$1" ]; then
echo Usage: ${0##*/} version
echo eg. version=13.1
exit
fi

Server="ftp5.gwdg.de"
ServerDir="pub/opensuse/update"

VersionRegex="12\.2|12\.3|13\.1"

for Version in $@; do

if [[ $Version =~ $VersionRegex ]]; then
DestDir="/misc/syno-vol1/mirror/suseupdate/i386/update"
else
DestDir="/mirror/suseupdate/i386/update"
fi

RsyOpts="-av --delete --delete-excluded --backup --backup-dir=$DestDir/$Version.backup --exclude-from=/home/pit/rsync_suse.excluded"

echo "rsync $RsyOpts $Server::$ServerDir/$Version/ $DestDir/$Version"
rsync $RsyOpts $Server::$ServerDir/$Version/ $DestDir/$Version

done


Zum Warmwerden auch gleich noch die passende Brace Expansion:

./rsync_suse_update 12.{2,3} 13.1

:)