Почему параметры в цитируемой переменной терпят неудачу, но работают без кавычек?

Использование псевдонима или, лучше, функции.

Например:

ssh () { command ssh "$@"; echo foobar; }

Теперь вы можете запустить:

ssh mysite

после выхода из сеанса ssh будет запущен echo foobar .

Замените echo foobar на фактическую команду, которую вам нужно запустить, и, конечно, вы можете использовать несколько команд, если хотите.

Чтобы сделать определение функции постоянным, поместите его в свой ~ / .bashrc .


Также обратите внимание, что не всегда может быть желательно иметь функцию с именем ssh , если вы хотите явно использовать внешний ssh . В этом случае вы можете использовать любое из следующих действий, чтобы пропустить функцию ssh для получения внешнего ssh двоичного файла:

command ssh mysite

или переименовать функцию в другое имя, например sshfunc :

sshfunc () { ssh "$@"; echo foobar; }
18
28.08.2017, 07:43
2 ответа

Самый надежный способ кодирования — использование массива:

wget_options=(
    --mirror 
    --no-host-directories
    --directory_prefix="$1"
)
wget "${wget_options[@]}" "$2/$3"
34
27.01.2020, 19:45

По сути, вы должны использовать двойные кавычки для раскрытия переменных, чтобы защитить их от разбиения на слова (и создания имени файла ). Однако в вашем примере

wget_options='--mirror --no-host-directories'
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"

разбиение слов — это именно то, что вам нужно .

С"$wget_options"(цитируется ), wgetне знает, что делать с единственным аргументом --mirror --no-host-directoriesи жалуется

wget: unknown option -- mirror --no-host-directories

Чтобы wgetувидел две опции --mirrorи --no-host-directoriesкак отдельные, должно произойти разделение слов.

Есть более надежные способы сделать это. Если вы используете bashили любую другую оболочку, использующую массивы, подобные bash, см. ответ glenn jackman . Ответ Жиля дополнительно описывает альтернативное решение для более простых оболочек, таких как стандартная /bin/sh. Оба по существу сохраняют каждую опцию как отдельный элемент в массиве.

Связанный вопрос с хорошими ответами:Почему мой сценарий оболочки забивается пробелами или другими специальными символами?


Двойное заключение переменных в кавычки — хорошее практическое правило. Сделай это . Тогда помните о очень немногих случаях, когда этого делать не следует. Они будут представлены вам через диагностические сообщения, такие как приведенное выше сообщение об ошибке.

Есть также несколько случаев, когда вам не нужно заключать раскрытия переменных в кавычки. Но в любом случае проще продолжать использовать двойные кавычки, так как это не имеет большого значения. Один из таких случаев

variable=$other_variable

Другой

case $variable in
   ...)... ;;
esac
28
27.01.2020, 19:45

Теги

Похожие вопросы