39

Неудачный, упрощенный пример:

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

Мне нужно включить кавычки, как если бы команда была такая:

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

3 ответа3

46

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

Длинный ответ: Поместить команды (или части команд) в переменные, а затем вернуть их нетронутыми, сложно. Когда оболочка раскрывает переменную в командной строке, если переменная заключена в двойные кавычки, она не анализируется; если это не было в кавычках, пробелы в нем анализируются как разрывы аргументов, но кавычки и escape не анализируются. В любом случае, помещение кавычек в значение переменной ничего не дает.

Обычно лучший способ сделать это - использовать массив вместо простой текстовой переменной:

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

Eval это еще один вариант:

$ x="'a b'"
$ printf '%s,%s' $x
'a,b'
$ eval printf '%s,%s' $x
a b

Смотрите также:

-1

Я не вижу проблемы:

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

Может быть, вам нужно снова процитировать значение:

$ rsync "$FLAGS" dir1 dir2

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .