Heinrich_Schwietering
Wikiteam
Anmeldungsdatum: 12. November 2005
Beiträge: 11288
|
Hi! Wenn das then auf die nächste Zeile kommt, geht es auch ohne ;. Wenn es in der selben Zeile steht, geht es nicht ohne das Semikolon - zumindest beim DVB-Teletext-Skript; ganz wie user unknown es geschrieben hat (hatte ich eben noch nicht gesehen, sorry). so long hank
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17432
|
Wenn ich es mit --posix starte funktioniert es übrigens auch:
| bash --posix ./willkommen.sh Pinug
Hallo Pinug
|
Wieso die dash da ein Semikolon will ist mir schleierhaft. Aus der Manpage der dash:
Lists – Generally Speaking
A list is a sequence of zero or more commands separated by newlines, semicolons, or ampersands, and optionally terminated by one of
these three characters. The commands in a list are executed in the order they are written. If command is followed by an amper‐
sand, the shell starts the command and immediately proceed onto the next command; otherwise it waits for the command to terminate
before proceeding to the next one.
... | if list
then list
[ elif list
then list ] ...
[ else list ]
fi
|
Die Notwendigkeit eines Semikolons kann ich hier nicht ableiten. Schätze, es ist ein Bug.
|
aasche
Anmeldungsdatum: 30. Januar 2006
Beiträge: 14259
|
Heinrich Schwietering schrieb: Wenn das then auf die nächste Zeile kommt, geht es auch ohne ;. Wenn es in der selben Zeile steht, geht es nicht ohne das Semikolon.
Stimmt, ueber dieses merkwuerdige Verhalten bin ich gestolpert. Vorherige Revision wiederhergestellt.
|
TausB
Anmeldungsdatum: 26. November 2009
Beiträge: 1536
|
Die Variable $IFS erfüllt noch weitere Zwecke, zum Beispiel wird ihr Inhalt beim Wordsplitting verwendet. Sie sollte nur mit Vorsicht umbelegt werden. Im Zweifelsfalle sollte man sich den Inhalt vorher in eine andere Variable sichern und diesen Wert später wiederherstellen.
Das Sichern ist unnötig, ein einfaches
unset IFS
stellt den Standard wieder her.
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2503
|
TausB schrieb: Die Variable $IFS erfüllt noch weitere Zwecke, zum Beispiel wird ihr Inhalt beim Wordsplitting verwendet. Sie sollte nur mit Vorsicht umbelegt werden. Im Zweifelsfalle sollte man sich den Inhalt vorher in eine andere Variable sichern und diesen Wert später wiederherstellen.
Das Sichern ist unnötig, ein einfaches
unset IFS
stellt den Standard wieder her.
Es stellt vermutlich in den meisten Fällen das Standardverhalten wieder her, aber nicht den Standardwert. Nach einem „unset “ hast du hinterher eben nicht mehr „<space><tab><newline> “ in der Variable stehen. Wenn du aus irgendwelchen obskuren Gründen weiter hinten im Skript dann doch den Standardwert benötigst, geht es in die Hose. Und sei es sowas ungeschicktes:
| unset IFS
# default separators used for field splitting
# ... ... ...
save_IFS=$IFS
IFS=:
# ...
IFS=$save_IFS
# no field splitting performed
|
Ich halte den Hinweis im Artikel für berechtigt.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17432
|
(update) - hat sich erledigt.
|
Toledo_Thomas
Anmeldungsdatum: 18. November 2007
Beiträge: 141
|
Hallo zusammen, ich bin grad über den Abschnitt mit der if-esle-Anweisungen gestolpert Shell/Bash-Skripting-Guide für Anfänger (Abschnitt „If-Else-Anweisung“) und zwar das 4. Beispiel Wie ist ihr Name. Meines Wissens nach müssten doppelte eckige Klammern verwendet werden und das doppelte Gleichheitszeichen und ein Semikolon. Verwendet werden einfache Klammern, doppeltes gleich und kein Semikolon mein Test ergab: So wie es da steht funktionierts nicht. Stattdessen: einfache eckige Klammern, einfaches Gleichheitszeichen und das Senikolon ist egal Ich bin noch nicht so der Skripting-Pro deshalb will ichs nicht direkt ändern, sondern frag erstmal nach.. bash-Version ist:
| GNU bash, Version 4.2.20(1)-release (x86_64-pc-linux-gnu)
|
Gruß Thomas
|
Lasall
Ehemalige
Anmeldungsdatum: 30. März 2010
Beiträge: 7723
|
Hi Toledo Thomas, wird die Bash auch genutzt? Welchen Wert hat $SHELL ? Ich vermute, dass du mit der Dash unterwegs bist. Gruss
Lasall
|
Toledo_Thomas
Anmeldungsdatum: 18. November 2007
Beiträge: 141
|
außerdem hab ich ja auch den Kopf des Skriptes übernommen..
also #!/bin/bash Gruß
|
Lasall
Ehemalige
Anmeldungsdatum: 30. März 2010
Beiträge: 7723
|
Hi Toledo Thomas, ich glaube noch immer nicht, dass du die Bash dafür genutzt hast. Wie hast du das Skript aufgerufen? Gruss
Lasall
|
Toledo_Thomas
Anmeldungsdatum: 18. November 2007
Beiträge: 141
|
erstellt hab ichs mit Yakuake → vim Skript.sh → strg+shift+v (also copy & paste aus dem Wiki) → sh Skript.sh Gruß
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
|
Die dort geschriebene Version funktioniert sehr wohl unter der bash, wie Du leicht probieren kannst: track@lucid:~$ if [ 1 == 1 ]
> then echo ja
> else echo nein
> fi
ja Lediglich, wenn das then in die 1. Zeile vorgezogen wird, ist davor ein Semikolon nötig, als Ersatz für den Zeilenwechsel. Nicht funktioniert das unter der dash; dort ist tatsächlich das (Posix-kompatible) einfache "=" erforderlich: track@lucid:~$ dash
$ if [ 1 == 1 ]
> then echo ja
> else echo nein
> fi
[: 4: 1: unexpected operator
nein
$ if [ 1 = 1 ]
> then echo ja
> else echo nein
> fi
ja Kommst Du denn bei diesem Beispiel zu einem anderen Ergebnis ? Edit: erstellt hab ichs .... → sh Skript.sh
Das ist das Problem ! - Wenn Du ausdrücklich (!!) die sh aufrufst und das Skript an diese Shell übergibst, dann soll wohl die sh und niemand sonst das Skript ausführen ...! Da hat der Shebang dann keine Chance mehr. track
|
Toledo_Thomas
Anmeldungsdatum: 18. November 2007
Beiträge: 141
|
ich habs grad selbst gemerkt, dass ich mit sh die bash anscheined umgehe. hab grad chmod +x und ./Skript.sh ausgeführt nun funktioniert. Sorry für die Umstände, das war mir nicht bewusst Gruß Thomas
|
Toledo_Thomas
Anmeldungsdatum: 18. November 2007
Beiträge: 141
|
das ich die if-Anweisungen nach einander direkt in der Shell also ohne Skript schreiben kann, war mir auch noch nichz klar.. wieder was dazu gelernt..
|
Danton
Anmeldungsdatum: 9. Juni 2008
Beiträge: 172
|
Ich möchte noch anführen das man mit checkbashisms gut Bashismen erkennen kann dieser Skript gibt diese aus.
Dies hat den Vorteil das man /bin/sh –→ /bin/dash nutzen kann, was enorme Geschwindigkeits-Vorteil bringt.
Oft sind diese nicht mal Sinning da sie keine Vorteile bringen wie zb. bei function oder source.
|