У меня есть команда rsync со следующими параметрами:
rsync -avz --{partial,stats,delete,exclude=".*"}
Я хочу поместить эти параметры в переменную, чтобы использовать ее после в скрипте. Что-то вроде этого:
#!/bin/bash
VAR=rsync -avz --{partial,stats,delete,exclude=".*"}
$VAR /dir1 /dir2
Я пробовал с кавычками, одинарные кавычки, скобки, но безуспешно.
bash
shell-script
Kellyson
источник
источник
Ответы:
Помещение сложной команды в переменную никогда не рекомендуется. Смотрите BashFAQ / 050 - я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу!
Ваше требование становится действительно простым, если вы просто решите использовать функцию вместо переменной и передать ей аргументы.
Что-то типа
и теперь передайте необходимые аргументы ему как
Определение функции довольно просто, мы сначала проверяем количество входных аргументов, используя переменную,
$#
которая не должна быть нулевой. Мы выдаем сообщение об ошибке, в котором говорится, что аргументы не указаны. Если есть допустимые аргументы, то"$@"
представляет фактические аргументы, предоставленные функции.Если вы используете эту функцию довольно часто, например, в скриптах / командной строке, добавьте ее
.bashrc
,.bash_profile
например, в файлы запуска оболочки .Или, как уже отмечалось, возможно, стоит расширить расширение скобок, чтобы разделить аргументы для лучшей читаемости, так как
источник
Он пытается выполнить команду
-avz
с аргументами--partial
и--stats
т. Д. И сVAR
установленным наrsync
в среде.Форма в кавычках не работает, потому что фигурные скобки не раскрываются в кавычках, а не внутри заданий, и они также не раскрываются после раскрытия переменной.
Если вам нужно сохранить аргументы командной строки в переменной, используйте массив:
Теперь
"${args[@]}"
будет расширятьсяrsync
,-avz
,--partial
и т.д. , как отдельные слова.Массивы также позволяют вам добавлять опции в список, условно, если это необходимо, так что вы можете, например:
источник
Вы можете по крайней мере частично сохранить параметры в переменной:
Тестирование важно, потому что маскировка может быть трудной:
Поскольку существует несколько альтернатив, таких как использование истории, использование псевдонима, использование функции, я не могу придумать очевидного варианта использования. Распределение параметров между различными программами редко бывает сложным, поэтому для специального решения для интерактивной оболочки псевдонимы выглядят лучшим способом:
Ваш образец
не может работать, потому что назначение является endet в первом пробеле. Вы должны замаскировать пробелы:
довольно опасная вещь для тестирования, с этой опцией --delete, не так ли? Поскольку параметры могут содержать снова "," и одинарные кавычки, маскирование может стать очень трудным в ближайшее время. Я бы пошел за псевдоним или полагаться на историю.
Псевдоним может быть сохранен в файле ~ / .bashrc для непрерывного использования в течение нескольких сеансов. Функции также могут быть сохранены в bashrc, но они вам нужны, только если вы хотите обработать параметры, переданные в функцию, которая будет оценена в них.
источник