Як я можу використовувати змінну Bash (рядок), що містить лапки в команді?


45

Невдалий, спрощений приклад:

FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2

Мені потрібно включити лапки так, ніби команда була такою:

rsync --archive --exclude="foo bar.txt" dir1 dir2

Відповіді:


55

Коротка відповідь: див. BashFAQ # 50 ("Я намагаюся поставити команду в змінну, але складні випадки завжди провалюються!").

Довга відповідь: Введення команд (або частин команд) у змінні, а потім повернення їх недоторканими є складним. Коли оболонка розширює змінну в командному рядку, якщо змінна була у подвійних лапках, вона не розбирається; якщо його не було в лапках, пробіли в ньому аналізуються на розриви аргументів, але лапки та втечі не розбираються. У будь-якому випадку розміщення лапок у значенні змінної нічого корисного не робить.

Зазвичай найкращим способом зробити подібний варіант є використання масиву замість простої текстової змінної:

FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2

Святий Ісусе, це працює!
Славомир


-2

Я не бачу проблеми:

$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"

Можливо, вам потрібно ще раз цитувати значення:

$ rsync "$FLAGS" dir1 dir2

5
echoне показує, що ви думаєте, що це. Спробуйте printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"подивитися , чому ні один з цих варіантів роботи.
Гордон Девіссон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.