2013-06-14 10 views
7

Wie kann ich verhindern Bash Wörter innerhalb einer Teilzeichenfolge zu teilen? Hier ist ein etwas konstruiertes Beispiel, das Problem zu veranschaulichen:Verhindern Bash Wortaufspaltung in Teilzeichenfolge

touch file1 'foo bar' 
FILES="file1 'foo bar'" 
ls -la $FILES 

Ist es möglich, ‚foo bar‘ angesehen als eine Zeichenkette zu erhalten, indem die ls innerhalb von $ Befehl Dateien, die effektiv in demselben Verhalten führen würde wie die folgende Befehl?

ls -la file1 'foo bar' 
+3

Sie können nicht. [Benutze ein Array] (http://mywiki.wooledge.org/BashFAQ/050) wie Kojiro vorschlägt. Verwenden Sie die genaue Syntax wie gezeigt, die Anführungszeichen sind entscheidend. –

Antwort

14

ein Array verwenden:

files=(file1 'foo bar') 
ls -la "${files[@]}" 
+0

Danke. Der Kontext ist eigentlich so, dass ich ein Bash-Skript (s1.sh) habe, von dem ich ein anderes Skript (s2.sh) anrufe. s2.sh wiederum ruft einen Binärbefehl cmd auf und übergibt den Wert der Umgebungsvariablen CMD_OPTS als Argumente. Also am liebsten würde ich gerne CMD_OPTS in s1.sh einstellen können, ohne s2.sh überhaupt zu modifizieren. – marko

+2

@marko: Nicht möglich - Sie müssen 's2.sh' korrigieren. Stellen Sie außerdem sicher, dass es sich bei den Skripten um 'bash'-Skripte und nicht um'/bin/sh'-Skripte handelt - die POSIX-Shell unterstützt keine Arrays. –

+1

@ richard-hansen: ok, danke. – marko

2

Array-Lösung kojiro ist die beste Option hier. einfach eine andere Option präsentieren könnten Sie speichern Ihre Liste der Dateien in FILES mit einem anderen Feldtrenn als Leerzeichen und setzen IFS auf diesem Gebiet Separator

OLDIFS=$IFS 
FILES="file1:foo bar" 
IFS=':'; ls -la $FILES 
IFS=$OLDIFS