PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell Programmierung -- SHIFT



geist_der_foren
08.12.03, 16:25
Hi @all,

kann mir mal jeman erklären, was das SHIFT genau macht ???
Ich hab das noch nicht so ganz vertsanden ...

Tomonage
08.12.03, 16:41
shift "verschiebt" alle parameter um eins nach links, wenn ich mich nciht irre:


./script a b c d

dann ist paramter 1=a, 2=b, 3=c und 4=d

machst du jetzt shift

dann ist 1=b 2=c 3=d

das ist in schleifen nuetzlich

geist_der_foren
08.12.03, 16:44
Wo kann man das z.B. einsetzten ??? Hast du mir vielleicht ein beispiel ?
Wie ist das eigentlich wenn ich shift 2 mache, was passiert da ???

Der Gestreifte
08.12.03, 16:51
Probier das mal:
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13; do
echo $1
shift 1
done Rufst Du das Skript jetzt mit "skript 1 2 3 4 5 6 7 8 9 a b c d" auf, werden alle Positionsparameter ausgegeben, statt nur des eigentlichen "$1".
Das kann man z.B. auch nutzen, wenn man auf mehr als die eigentlich erlaubten (9?) Parameter zugreifen will.

Mit "shift 2" zählt er zwei weiter. ;o)

LX-Ben
08.12.03, 19:43
Shell Programmierung -- SHIFT / wo kann man das einsetzen?
Ein gängiger Einsatz ist das Einlesen von Parametern von der konsole, am Beispiel 'In jeweils unterschiedlichen Verzeichnissen*) soll mit find etwas gesucht werden, scriptname findall:'

Zeile 1: findall ruft Unterscript 'findexec $1', das nach Ausführung zu findall 'zurückkehrt'
2. Dann folgt der Befehl 'shift 1'
3. Dann wird die nachgeschobene Variable $1 (zu Anfang $2) auf leeren Inhalt geprüft und sofern nicht leer wieder in Zeile1: zurückgesprungen - ansonsten script-Ende usw.

*) etwa nach einem installiertem Programm in /usr /opt und /home suchen lassen, anstatt das gesamte '/' abzugrasen.

geist_der_foren
09.12.03, 08:17
Hi @all, danke schon mal für eure Antworten, ich glaube es jetzt einiger massen, verstanden zu haben, kann mir vielleicht noch jemand erklären wieso in diesen Code Snipsel, SHIFT benutz wird ???
if [ "$1" == "-t" ] ; then
test="yes"
shift 2
fi

while [[ $1 == -* ]]
do
case "$1" in
-u) uid="$2" ;;
-g) gid="$2" ;;
-G) sgids="$2" ;;
-d) home="$2" ;;
-c) com="$2" ;;
-s) shell="$2" ;;
-k) profdir="$2" ;;
*) echo "Optionen: -ugGdcsk (man useradd)" && exit 1 ;;
esac
shift 2
done

Wie ist das eigentlich, wenn ich jetzt zum Beispiel folgedes weg lasse, kann ich dann in der while Schleife, das shif2 lassen ?


if [ "$1" == "-t" ] ; then
test="yes"
shift 2
fi

Nvidia
09.12.03, 14:39
ich verstehe zwar nicht warum der -t parameter extra behandelt wird
aber hier werden einfach alle parameter abgearbeitet.

und falls vorhanden eine variable gefüllt:



./programmname -u user1 -g group1


setzt im programm die variablen
uid auf user1 und gid auf group1 ...

geist_der_foren
09.12.03, 16:00
Jetzt hab ich das skript verstanden ... Danke für die Hilfe @all