Archiv verlassen und diese Seite im Standarddesign anzeigen : Faehigkeiten der bash
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?
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.
Nachtrag:
Und ein
./rsync_suse_update {12.2,12.3,13.1}aktualisiert nur Version 12.2.
Gruss Pit.
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.
Zusaetzliche Zeile eingefuegt in mein Script:
echo "parm1 ist $1"
Beim ersten und einzigsten Aufruf wird "12.2" ausgegeben.
Gruss Pit.
naja, nachdem die Lösung nun quasi schon da steht noch ein wenig Lektüre:
http://www.linux-praxis.de/linux1/shell2_4.html
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.
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... :-)
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.
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
:)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.