Kommando in Variable mit "

M

Maskotchen

Hallo!

Ich komm hier mit der bash nicht mehr weiter, folgendes Testskript:

Code:
a="ls datei"
echo $a
$a

Das funktioniert wie erwartet, es wird ls datei ausgegeben und das gleiche dann auch korrekt als Befehl ausgeführt.

Ich möchte nun aber, dass datei in Anführungszeichen steht, also schreib ich so:
Code:
a="ls \"datei\""
# oder
a='ls "datei"'
echo $a
$a

Das echo zeigt genau das an, was ich erwarte, aber der Befehl wird dann nicht mehr korrekt ausgeführt! Doch wenn ich selbst auf der Kommandozeile ls "datei" eintippe, gehts!

Was hat die Bash da schon wieder? $a ist doch $a oder gibts da einen Unterschied?

--
Steffen
 
Geht aber leider auch nicht mit eval.

Das Problem ist, dass ein dateiname mit Anführungsstrichen gesucht wird und das will ich aber natürlich nicht so.

Ich will einfach nur zwei Anführungsstriche (doppelt oder einfach) innerhalb eines Aufrufparameters in der Variable mit drin haben.

Vielleicht gehts nicht so einfach und man muss sowas wie xargs verwenden?

--
Steffen
 
also dein obiges beispiel geht mit eval schon:
Code:
a='ls "datei"'
echo $a
eval $a
ich versteh nicht was du wirklich machen willst
 
Vielleicht verstehe ich das ja falsch, aber bei mir tut Folgendes:
tg@nachtigaller:~$ touch datei
tg@nachtigaller:~$ a='ls "datei"'
tg@nachtigaller:~$ $a
ls: "datei": No such file or directory
tg@nachtigaller:~$ eval $a
datei
Was genau tut bei Dir nicht?
 
probier mal:
a="ls \"datei\""
echo $a
$a

so gehts in php
 
Geht doch!

Ja, sorry, mit eval gehts jetzt doch bei mir, habs nochmal getestet!

Aber verstehen tu ich trotzdem nicht, was der Unterschied zwischen
$a
und
eval $a
sein soll!? Ich würde gerne verstehen, wie die bash arbeitet.

Danke für eure Hilfe!
 
normalerweise wird ein eingegebenes command 1x von der shell geparsed, mit eval aber 2x. um bei deinem beispiel zu bleiben:
Code:
$ a='ls "datei"'
$ echo $a
ls "datei"
die variable a enthält jetzt das von der shell geparste ergebnis. wie du siehst wird jetzt nach einer datei mit namen "datei" gesucht,d.h. der dateiname selbst enthält hochkommas, die hochkommas sind teil des namens.
daher geht ein
Code:
$ $a
ls: "datei": No such file or directory
nicht, es gibt eben keine datei mit namen "datei"
anders bei eval
Code:
$ eval $a
datei
hier wird 2x geparsed, beim ersten durchgang werden die äusseren, einfachen hochkommas entfernt, die inneren doppelten bleiben vorhanden, die sind für die shell ja quasi nicht sichtbar, weil innerhalb der einfachen hochkommas.
danach wird noch einmal geparsed, jetzt werden die doppelten hochkommas von der shell gesehen und entfernt. ergebnis ist, dass jetzt nach einer datei namens datei gesucht wird und die ist ja wirklich vorhanden.
 

Ähnliche Themen

Dateiname einer Befehlsausgabe als Variable festlegen

Löschroutine mit Überprüfung

Routingprobleme mit iptables

awk: Dateiinhalt/Variableninhalt als Teil einer if-Anweisung

grep und Variablen

Zurück
Oben