• [gelöscht]

Hallo,

ich möchte in einem sh Skript an den aktuellen Pfad ein Unterzeichnis anhängen (nur als String).

vz=${PWD}
vztief=${PWD}"/blub"
echo vztief
Das klappt einfach nicht, da das "/blub" an den Anfang gesetzt wird. Die Ausgabe lautet also /blub/richtigespwd...
Dabei überschreibt /blub vorne etwas vom pwd.

Kann mir jemand helfen und sagen was ich falsch mache?

Das Beispiel habe ich schnell zusammengetippt, zeigt aber deutlich das Problem.
Hi,
also es kann auch so aussehen
vztief=$PWD/blub
echo $vztief
/foo/blub
Abakus
[moe@jill tmp]$ vz=${PWD}
[moe@jill tmp]$ echo $vz
/tmp
[moe@jill tmp]$ vztief=${PWD}"/foo"
[moe@jill tmp]$ echo $vztief
/tmp/foo
[moe@jill tmp]$ sh --version
GNU bash, Version 4.0.28(2)-release (i686-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
Lizenz GPLv3+: GNU GPL Version 3 oder jünger <http://gnu.org/licenses/gpl.html>

Dies ist freie Software.  Sie darf verändert und verteilt werden.
Für dieses Programm besteht keinerlei Garantie.
Mach ich irgendwas anders als du?

@Abakus: Nein es muss nicht so aussehen, es ist sogar besser, Variablen als ${Variable} zu schreiben. man könnte sich maximal streiten ob es
vztief="${PWD}/blub"
sein müsste.
echo vztief
gibt m.E. den String "vztief" aus und nicht der Wert der Variablen vztief.
echo ${vztief}
würde das Erwartete leisten. Und das hat moe auch anders gemacht als Thomas A.
Stefan Husmann schrieb
echo vztief
gibt m.E. den String "vztief" aus und nicht der Wert der Variablen vztief.
echo ${vztief}
würde das Erwartete leisten. Und das hat moe auch anders gemacht als Thomas A.
Siehe:
Thomas A schrieb Das Beispiel habe ich schnell zusammengetippt, zeigt aber deutlich das Problem.
Das schnell zusammengetippte hatte vermutlich nichts mit dem echten Skript zutun... für
sowas haben wir doch unsere Glaskugeln. 😉

cu
  • [gelöscht]

vz=$PWD
vztief=${PWD}"/lib"
vzA="${vztief}/c.jar;${vztief}/a.jar"
echo vzA

Beim vzA kracht es jetzt. Muss ich den "." oder so escapen? Es wird zweimal am Anfang .jar.jar ausgegeben
  • [gelöscht]

Ich scheine an keine "normale" Variable etwas ordentlich anhängen zu können.
echo ${vztief}"/blub"
Gibt "/blubteilvonvztief" aus. Irgendwas mache ich da falsch.
Da hast du dasselbe Problem. Es geht um die Syntax von echo:

echo xyz gibt die Zeichenfolge xyz aus.
echo ${xyz} gibt den Inhalt der Variablen xyz aus.

(Genau genommen wird ${xyz} von Bash ausgewertet (siehe: man bash) und das Ergebnis als Zeichenfolge an echo übergeben.)

Edit:
echo ${vztief}"/blub"
Gibt "/blubteilvonvztief" aus.
verstehe ich nicht ganz. Kommt das wörtlich so bei dir???

Bei mir gibt es folgendes:
bp:~$ echo ${vztief}
/home/bp/lib
bp:~$ echo ${vztief}"/blub"
/home/bp/lib/blub
also genau das Gewünschte.
  • [gelöscht]

Konkretes Beispiel:
a="/home/user/test/"
echo ${a}"/abcd.jar"

Ausgabe:
/abcd.jarr/test/
Seltsam. Was für eine Shell verwendest du denn?
  • [gelöscht]

Interessante Sache:

Wenn ich es direkt in die Shell tippe, kommt das richtige heraus. Packe ich denselben Code in einer .sh Datei mit #!/bin/bash oben dran, stimmt es nicht mehr.
  • [gelöscht]

Ich benutze XFCE und führe das Skript in "terminal" aus. Direkt eingegeben klappt es, per Datei nicht.
Bei mir klappt es auch aus einer Datei heraus. Allerdings, wie scho mehrfach gepostet mit einem
echo $vzA
am Ende.
Thomas A schrieb Ich benutze XFCE und führe das Skript in "terminal" aus.
Kann das Problem auch nicht nachvollziehen. Ist aber irgendwie so kurios, dass ich's jetzt auch wissen will. 🙂 Magst du mal die Ausgabe der folgenden Befehle posten?
echo $SHELL
ls -al /bin/sh
ls -al /bin/bash
Und mit welchen dieser beiden Möglichkeiten startest du das Skript?
bash blabla.sh
oder
chmod u+x blabla.sh
./blabla.sh
Wie sieht die Sache denn aus, wenn du vor der Eingabe der Befehle (oder am Anfang des Skripts) ein set -x eingibst, um zu sehen, was er wie expandiert? Mal testweise: Passiert das auch, wenn du statt der Schrägstriche "/" irgendwas anderes verwendest, z.B. "-"?
  • [gelöscht]

echo $SHELL
/bin/bash

ls -al /bin/sh
lrwxrwxrwx 1 root root 4 1. Aug 11:23 /bin/sh -> bash

ls -al /bin/bash
-rwxr-xr-x 1 root root 694072 1. Aug 11:23 /bin/bash
Ich starte mit bash skript.sh

Das Skript
a="-home-user-test-"
echo ${a}"-abcd-jar"
produziert:
-abcd-jarr-test-
Kann es sein, dass du in deinem Editor Windows-Zeilenenden eingestellt hast? Dann nämlich endet eine Zeile auf "<CR><LF>" statt wie bei Unix üblich nur "<LF>". Das "<CR>" ist also ein zusätzliches Zeichen vor dem eigentlichen Ende der Zeile und bedeutet "Wagenrücklauf", sprich: Setze den Cursor an den Anfang der Zeile.

In deinem kleinen Testfall mit Windows-Zeilenenden sähe die Datei in Wirklichkeit also so aus (ich setze jetzt auch mal voraus, dass dein Skript nicht mit einem abschließenden Zeilenumbruch aufhört):
#!/bin/bash<CR><LF>
a="-home-user-test-"<CR><LF>
echo ${a}"-abcd-jar"
Zusätzlich rufst du das Skript mit bash skript.sh auf, also ist die erste Zeile komplett egal (beim Aufruf über ./skript.sh käme schon hier ein Fehler). In der zweiten Zeile passiert deine Zuweisung -- Bash sieht "<CR>" aber scheinbar als normales Zeichen und nicht als "Zeilenende" an. Heißt, in deiner Variable steht drin:
-home-user-test-<CR>
Beim echo gibst du zuerst diesen String aus und genau das tut er dann auch. Und er setzt den Cursor an den Zeilenanfang zurück. Danach kommt dein "-abcd-jar" und überschreibt das, was bisher dort stand.

Wenn ich das Skript genau so mit Windows-Zeilenenden speichere und auch so wie du aufrufe, dann erhalte ich auch dein scheinbar falsches Ergebnis.

Speichere die Datei doch mal mit Unix-Zeilenenden oder gib sie testweise in in einem anderen Editor ein.

Wäre so mein Erklärungsversuch jetzt. 😉
  • [gelöscht]

Das hört sich ganz plausibel an, nur wo stelle ich das beispielsweise in KWrite um?
Wie das in KWrite geht weiß ich nicht, aber man kann das ganze auch mit tr machen.

Probier doch mal ein:
tr -d '\r' < alteDatei > neueDatei
Thomas A schrieb Das hört sich ganz plausibel an, nur wo stelle ich das beispielsweise in KWrite um?
Einstellungen -> Editor einrichten
Öffnen/Speichern
Zeilenende -> Unix
Thomas A schrieb vz=${PWD}
vztief=${PWD}"/blub"
echo vztief
Das klappt einfach nicht, da das "/blub" an den Anfang gesetzt wird. Die Ausgabe lautet also /blub/richtigespwd...
Dabei überschreibt /blub vorne etwas vom pwd.

Kann mir jemand helfen und sagen was ich falsch mache?

Das Beispiel habe ich schnell zusammengetippt, zeigt aber deutlich das Problem.
Sorry, aber so ein Verhalten halte ich für völlig ausgeschlossen.

Führe es mir live auf Deinem Rechner vor und Du sollst einen Abend lang meine großzügige Gastfreundschaft geniessen. Oder hast Du die Shell dafür selbst geschrieben? 🙂

vg, LW