2013-06-14 8 views
7

Jak mogę zapobiec dzieleniu wyrazów w podłańcuchu przez Bash? Oto nieco wymyślony przykład do zilustrowania problemu:Zapobieganie podziałowi słów w podciągach

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

Czy to możliwe, aby uzyskać „foo bar” traktuje się jako jeden ciąg przez polecenia ls ciągu $ pliki, które skutecznie prowadzić w tym samym zachowanie jako następujące dowództwo?

ls -la file1 'foo bar' 
+3

Nie możesz. [Użyj tablicy] (http://mywiki.wooledge.org/BashFAQ/050), jak sugeruje kojiro. Użyj dokładnej składni, jak pokazano, cytaty są kluczowe. –

Odpowiedz

14

pomocą tablicy: rozwiązanie tablica

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

Dzięki. Kontekst jest tak naprawdę taki, że mam skrypt bash (s1.sh), z którego wywołuję inny skrypt (s2.sh). s2.sh z kolei wywołuje polecenie binarne cmd i przekazuje wartość zmiennej środowiskowej CMD_OPTS jako argumenty. Tak więc najlepiej byłoby móc ustawić CMD_OPTS w s1.sh bez faktycznego modyfikowania s2.sh. – marko

+2

@marko: Nie możliwe - musisz naprawić 's2.sh'. Upewnij się również, że skrypty są w rzeczywistości skryptami 'bash', a nie'/bin/sh' - powłoka POSIX nie obsługuje tablic. –

+1

@ richard-hansen: ok, dzięki. – marko

2

Kojiro jest najlepszym rozwiązaniem tutaj. Wystarczy przedstawić inną opcję można zapisać listę plików w FILES o innym niż biały znak separatora pól i ustaw IFS do tego separatora pól

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