Warum wird in u.a. Beispiel das Verzeichnis, dessen Name Leerzeichen enthält, nicht erkannt? var="/home/ab/dir\ mit\ blank/" if [ -d "$var" ]; then echo existiert else echo existiert nicht fi Al
Al Bogner wrote:
Warum wird in u.a. Beispiel das Verzeichnis, dessen Name Leerzeichen enthält, nicht erkannt?
var="/home/ab/dir\ mit\ blank/"
Wenn Du den Pfad schon mit """ angibst, brauchst bzw. darfst Du die Leezeichen nicht mehr zu entwerten. var="/home/ab/dir mit blank/"
if [ -d "$var" ]; then echo existiert else echo existiert nicht fi
-- Andreas
Al Bogner wrote:
Warum wird in u.a. Beispiel das Verzeichnis, dessen Name Leerzeichen enthält, nicht erkannt?
var="/home/ab/dir\ mit\ blank/"
Die Blanks dürfen hier nicht escaped werden, da Du sonst im nächsten Befehl nach einem Directory mit Namen "/home/ab/dir\ mit\ blank" suchst. Backslashes sind im Dateinamen erlaubt.
if [ -d "$var" ]; then echo existiert else echo existiert nicht fi
Gruss Jens
Am Freitag, 3. Oktober 2003 16:38 schrieb Andreas Winkelmann:
Al Bogner wrote:
var="/home/ab/dir\ mit\ blank/"
Wenn Du den Pfad schon mit """ angibst, brauchst bzw. darfst Du die Leezeichen nicht mehr zu entwerten.
Das hatte ich probiert und nun weiß ich, warum es Probleme gab, das Beispiel von mir war zu simpel. Es liegt vermutlich an meiner eval-Syntax. Auf http://lists.suse.com/archive/suse-linux/2003-Oct/0258.html gab es noch nicht die Antwort, die mich weiterbringt. (Mit Arrays werde ich mich schon noch beschäftigen, wenn ich mehr Erfahrung gesammelt habe) Die von Bernd erwähnte Syntax reiht im Ergebnis nur $i nebeneinander und daher habe ich mal die als fehlerhafte Syntax "datei=$(eval echo \$datei$i)" verwendet, da sie für meine Aufgabenstellung funktionierte. Das Verzeichnis /home/ab/dir\ mit\ blank1/ exisitert dir=/home/ab/dir\ mit\ blank/ i=1 dir=$(eval echo "\$dir$i") if [ -d "$dir" ]; then echo existiert else echo existiert nicht fi Mit dieser Syntax existiert das Directory nicht. Wie müßte man die Syntax verändern, wenn es eine unbekannte Anzahl an ähnlich lautenden Verzeichnis gibt, also zB blank1, blank2, etc. und man abfragen möchte, ob irgendeines mit blank1, blank2, etc. existiert bzw. keines mit blank1, blank2, etc. Al
Hallo, Am Fri, 03 Oct 2003, Al Bogner schrieb:
habe ich mal die als fehlerhafte Syntax "datei=$(eval echo \$datei$i)" verwendet, da sie für meine Aufgabenstellung funktionierte.
Das Verzeichnis /home/ab/dir\ mit\ blank1/ exisitert
dir=/home/ab/dir\ mit\ blank/ ^^keine 1? i=1 dir=$(eval echo "\$dir$i")
Dann ist $dir1 hier dann leer. $ sh test_blanks.sh ++ eval echo '$dir1' +++ echo + dir= + '[' -d '' ']'
if [ -d "$dir" ]; then echo existiert else echo existiert nicht fi
Mit dieser Syntax existiert das Directory nicht.
Wie müßte man die Syntax verändern, wenn es eine unbekannte Anzahl an ähnlich lautenden Verzeichnis gibt, also zB blank1, blank2, etc. und man abfragen möchte,
==== test_blanks.sh ==== #! /bin/bash # set -x dir1="./foo bar" dir2="./dir mit blank" dir3="./bin dir" dir4="./bla blubb" i=0 while test $i -lt 4 do i=$(( i + 1 )) eval "dir=\"\${dir$i}\"" if [ -d "$dir" ]; then echo "dir='$dir' existiert" else echo "dir='$dir' existiert nicht" fi done ==== $ sh ./test_blanks.sh dir='./foo bar' existiert nicht dir='./dir mit blank' existiert dir='./bin dir' existiert dir='./bla blubb' existiert nicht -dnh -- I'm broken. Please show this to someone who can fix can fix -- A message in a TeX system (Kudos to H J Haataja for the sig)
Am Freitag, 3. Oktober 2003 19:33 schrieb David Haller:
Am Fri, 03 Oct 2003, Al Bogner schrieb:
habe ich mal die als fehlerhafte Syntax "datei=$(eval echo \$datei$i)" verwendet, da sie für meine Aufgabenstellung funktionierte.
Das Verzeichnis /home/ab/dir\ mit\ blank1/ exisitert
dir=/home/ab/dir\ mit\ blank/
^^keine 1?
ja du hast recht, da passt das Beispiel nicht. Neutrale Beispiele aus einem konkreten Script zu bringen, ist gar nicht so einfach :-) Es würde aber auch nichts bringen, die konkreten Teile zu zitieren, da müsste ich viel zu viel erklären. dir1, dir2, etc. wird anfangs definiert also zB dir1=/home/ab/dir\ mit\ blank1/ dann wird die Variable dynamisch generiert und in einer Schleife abgearbeitet (ich weiß schon array ...) Es soll also später eine Variable dir erzeugt werden, die die Werte von dir1, dir2, etc. annimmt. Wie lautet nun die korrekte "eval-Syntax"? i=1 dir1=/home/ab/dir\ mit\ blank1/ dir=$(eval echo "\$dir$i") #gefragt ist der "Inhalt von dir1" echo $dir #ist so leer
Wie müßte man die Syntax verändern, wenn es eine unbekannte Anzahl an ähnlich lautenden Verzeichnis gibt, also zB blank1, blank2, etc. und man abfragen möchte,
==== test_blanks.sh ====
Ich muß das noch erst genauer überlegen. Jedenfalls ist es nicht mit 1 Befehlszeile zu realisieren. Vielen Dank! Al
Hallo, Am Fri, 03 Oct 2003, Al Bogner schrieb:
Am Freitag, 3. Oktober 2003 19:33 schrieb David Haller: [..] Wie lautet nun die korrekte "eval-Syntax"?
i=1 dir1=/home/ab/dir\ mit\ blank1/ dir=$(eval echo "\$dir$i") #gefragt ist der "Inhalt von dir1" echo $dir #ist so leer
So wie ich es dir im Beispiel-script geschrieben habe.
==== test_blanks.sh ====
Ich muß das noch erst genauer überlegen. Jedenfalls ist es nicht mit 1 Befehlszeile zu realisieren. Vielen Dank!
Dein Fehler ist falsches quoten (sic!). Es geht auch mit dem von dir
verwendeten `eval echo $dir`, allerdings eben nur, wenn man ebenso
korrekt quotet.
==== test_blanks.sh ====
#! /bin/bash
#set -x
dir1="./dir mit blank"
dir2="./bin dir"
dir3="./foo bar"
#dir4="./bla blubb"
i=0
while test $i -lt 3
do
i=$(( i + 1 ))
eval "dir=\"\${dir$i}\""
test -d "$dir" && echo "existiert1: dir='$dir'" || echo "NO1: '$dir'"
dir="$(eval echo \"\${dir$i}\")"
test -d "$dir" && echo "existiert2: dir='$dir'" || echo "NO2: '$dir'"
dir="`eval echo \"\\${dir$i}\"`"
test -d "$dir" && echo "existiert3: dir='$dir'" || echo "NO3: '$dir'"
done
====
Da die letzteren beiden Variante (die mit $() bzw. ``) ein sub-shell
aufrufen sind diese _deutlich_ langsamer als die direkt ablaufende
erste Version.
Und ja, obiges sind die 3 moeglichen "richtigen" Varianten.
Die "eval-Syntax" hat mit deinem Problem naemlich nix zu tun:
====
$ help eval
eval: eval [arg ...]
Read ARGs as input to the shell and execute the resulting
command(s).
====
genauer dann in man bash:
====
eval [arg ...]
The args are read and concatenated together into a
single command. This command is then read and exe
cuted by the shell, and its exit status is returned
as the value of eval. If there are no args, or
only null arguments, eval returns 0.
====
Dein Problem war wohl, dass du das flasch quoten mit einem
"Syntax-Fehler" verwechselt hast, bzw. missverstanden, was "eval"
macht. eval wertet die Kommando-Zeile einfach nochmal aus:
eval "dir=\"\${dir$i}\""
Erste (normale) Auswertung liefert:
eval dir="${dir1}"
Jetzt kommt die zweite Auswertung durch das "eval", und die shell
expandiert das '${dir1}' zum Inhalt der Variablen:
dir="
Am Freitag, 3. Oktober 2003 20:22 schrieb Andreas Winkelmann:
Wo ist das Problem?
Speziellen Dank an dich und David für die Beispiele! Esrtmals danke! Ich muß einfach testen, unter welchen Bedingungen es nicht funktioniert. Schön langsam wird es eine Herausforderung dahinter zu kommen, wo es hakt. Dasselbe Script (nicht das gepostete Beispielscript) ein 2. Mal aufgerufen und nur einen Kommentar geändert und schon läuft es fehlerfrei durch. Schön langsam denke ich an ein fehlerhaftes System. info unison liefert Programming * MikMod: (mikmod). MikMod Sound Library. * NASM: (nasm). The Netwide Assembler for x86. * cvsclient: (cvsclient). The CVS client/server protocol. * g77: (g77). The GNU Fortran compiler. General Commands * Screen: (screen). Full-screen window manager. Miscellaneous * As: (as). The GNU assembler. * Bfd: (bfd). The Binary File Descriptor library. * Binutils: (binutils). The GNU binary utilities. * CVS: (cvs). Concurrent Versions System * Finding Files: (find). Listing and operating on files that match certain criteria. * Flex: (flex). A fast scanner generator. * Gas: (as). The GNU assembler. * Gpm: (gpm). A server wich hands mouse events to non-X programs. * Ld: (ld). The GNU linker. * Mmalloc: (mmalloc). The GNU mapped-malloc package. * SCPM: (scpm). System Configuration Profile Management * Shar utilities: (sharutils). GNU shar utilities. * Stabs: (stabs). The "stabs" debugging information format. * VFlib: (VFlib-36). A font library VFlib version 3.6.13 * addr2line: (binutils)addr2line. Convert addresses to file and line * ar: (binutils)ar. Create, modify, and extract from archives * bc: (bc). An arbritrary precision calculator language * c++filt: (binutils)c++filt. Filter to demangle encoded C++ symbols * cpio: (cpio). Making tape (or disk) archives. * cxxfilt: (binutils)c++filt. MS-DOS name for c++filt Woher stammt das? Das kann doch nicht zu unison gehören. Diese ziemlich lange Übersicht ist ja gar nicht so uninteressant, nur hätte ich gern alles in einer simplen Textdatei. Al
Al Bogner wrote:
info unison liefert
Programming * MikMod: (mikmod). MikMod Sound Library. * NASM: (nasm). The Netwide Assembler for x86. * cvsclient: (cvsclient). The CVS client/server protocol. * g77: (g77). The GNU Fortran compiler.
General Commands * Screen: (screen). Full-screen window manager.
Miscellaneous * As: (as). The GNU assembler. * Bfd: (bfd). The Binary File Descriptor library. * Binutils: (binutils). The GNU binary utilities. * CVS: (cvs). Concurrent Versions System * Finding Files: (find). Listing and operating on files that match certain criteria. * Flex: (flex). A fast scanner generator. * Gas: (as). The GNU assembler. * Gpm: (gpm). A server wich hands mouse events to non-X programs. * Ld: (ld). The GNU linker. * Mmalloc: (mmalloc). The GNU mapped-malloc package. * SCPM: (scpm). System Configuration Profile Management * Shar utilities: (sharutils). GNU shar utilities. * Stabs: (stabs). The "stabs" debugging information format. * VFlib: (VFlib-36). A font library VFlib version 3.6.13 * addr2line: (binutils)addr2line. Convert addresses to file and line * ar: (binutils)ar. Create, modify, and extract from archives * bc: (bc). An arbritrary precision calculator language * c++filt: (binutils)c++filt. Filter to demangle encoded C++ symbols * cpio: (cpio). Making tape (or disk) archives. * cxxfilt: (binutils)c++filt. MS-DOS name for c++filt
Woher stammt das? Das kann doch nicht zu unison gehören. Diese ziemlich lange Übersicht ist ja gar nicht so uninteressant, nur hätte ich gern alles in einer simplen Textdatei.
Es gibt kein "info unison", dies ist die Standard-Seite von info. Steht auch in der untersten Zeile. Alternativ kannst Du auch "info" ohne Argumente aufrufen oder "info gnuffelruff" ;-) -- Andreas
Hallo, Am Fri, 03 Oct 2003, Al Bogner schrieb:
Am Freitag, 3. Oktober 2003 20:22 schrieb Andreas Winkelmann:
Wo ist das Problem? [..] Esrtmals danke! Ich muß einfach testen, unter welchen Bedingungen es nicht funktioniert. Schön langsam wird es eine Herausforderung dahinter zu kommen, wo es hakt. Dasselbe Script (nicht das gepostete Beispielscript) ein 2. Mal aufgerufen und nur einen Kommentar geändert und schon läuft es fehlerfrei durch. Schön langsam denke ich an ein fehlerhaftes System.
Schick mal per PM das komplette script wenn du nicht selber dahinter kommst... Ich wiederhole mal meinen Standardsatz: Quoten, quoten, quoten! ;)
info unison liefert [..] Woher stammt das?
Das ist die info-Uebersicht, quasi das Menue von info, das alle bekannten info-pages auflistet... (siehe auch 'info info' und 'info install-info'). -dnh -- Windows verhält sich zu Betriebssystemen wie Astrologie zu Astronomie. -- am DLUG-Stammtisch
Am Freitag, 3. Oktober 2003 23:18 schrieb Andreas Winkelmann:
Es gibt kein "info unison", dies ist die Standard-Seite von info. Steht auch in der untersten Zeile. Alternativ kannst Du auch "info" ohne Argumente aufrufen oder "info gnuffelruff" ;-)
Die Beschreibung von unison ist nicht gerade leicht zu finden. Eher zufällig kam ich auf "unison -doc topics" Al
Am Freitag, 3. Oktober 2003 23:37 schrieb David Haller:
Schick mal per PM das komplette script wenn du nicht selber dahinter kommst...
Hallo David, das ist ganz nett von dir. Jetzt lief es schon 3x auf unterschiedlichen Rechnern durch. Es werden dabei viele Dateien komprimiert und die Tests und Plausibilitätsprüfungen dauern ziemlich lang. Ich komme in 1 Woche oder vielleicht später auf dein Angebot zurück, um ein paar Hinweise zur Programmiertechnik zu erhalten. Darf man das Script eigentlich verändern, wenn es bereits läuft? Wird das ursprüngliche Script also komplett in den Speicher geladen und von dort ausgeführt oder wird die Änderung auf der HD berücksichtigt? Al
Hallo, Am Sat, 04 Oct 2003, Al Bogner schrieb:
Darf man das Script eigentlich verändern, wenn es bereits läuft? Wird das ursprüngliche Script also komplett in den Speicher geladen und von dort ausgeführt oder wird die Änderung auf der HD berücksichtigt?
Das script laeuft (zumindest normalerweise) aus dem Speicher -- du kannst also unbesort weitereditieren und sogar abspeichern... Besser waere's aber schon, wenn du erst abspeicherst, wenn das script nicht laeuft. -dnh -- "The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' (I found it!) but 'That's funny ...'" -- Isaac Asimov
participants (5)
-
Al Bogner
-
Alexander Veit
-
Andreas Winkelmann
-
David Haller
-
Jens Tautenhahn