В bash, какой самый безопасный способ передать переменные в другую программу – $ * или $ @?

Может ли кто-нибудь объяснить мне вкратце, какая разница между этими двумя варами?

Каков самый безопасный способ передачи переменных в другую программу?

Например

#! /bin/bash # do stuff # pass variables onto another program java $@ 

  • Как я могу правильно ввести имя входного файла в find exec?
  • Как избежать $ здесь
  • Насколько переносимо это назначение оболочки?
  • Результаты задания Cron отличаются от выполнения из собственной оболочки
  • Команда «>» не работает только в встроенной Linux
  • переменная не изменяется после find & while
  • Как добавить автозаполнение для «драгоценного камня», которое с помощью rbenv?
  • Как сохранить переменную окружения через su -?
  • 3 Solutions collect form web for “В bash, какой самый безопасный способ передать переменные в другую программу – $ * или $ @?”

    Используя этот скрипт:

     #! /bin/sh # Greg Wooledge's args script printf "%d args:" $# printf " <%s>" "$@" echo 

    Попробуйте эту демонстрацию:

     $ set -- a 'bc' d $ args $* 4 args: <a> <b> <c> <d> $ args $@ 4 args: <a> <b> <c> <d> $ args "$*" 1 args: <abc d> $ args "$@" 3 args: <a> <b c> <d> 

    Обычно вы должны использовать "$@" (с кавычками).

    Иногда полезно изменить IFS и использовать "$*" :

     $ saveIFS=$IFS; IFS='|'; args "$*"; IFS=$saveIFS 1 args: <a|bc|d> 

    safeest – это "$@" потому что он передает arglist без расширения и разделяет каждый аргумент. Подробнее см. http://www.faqs.org/docs/abs/HTML/variables2.html#ARGLIST .

    Используйте: "$@" если вы хотите точно указать исходные аргументы (в том числе без аргументов).

    Существует 5 обозначений:

    • $@
    • $*
    • "$@"
    • "$*"
    • ${1+"$@"}

    Первые два эквивалентны; оба разделили слова в списке аргументов и передали их в вызываемую команду. Они редко являются правильным выбором.

    Вторые два радикально отличаются друг от друга. Обозначение "$@" эффективно копирует аргументы в оболочку (или аргументы, заданные с помощью команды set ), в вызываемую команду, сохраняя количество аргументов, пробелы внутри них и разделение между ними. Если есть нулевые аргументы, он ничего не генерирует.

    Обозначение "$*" вставляет все аргументы в одну строку, помещая пробел между аргументами, но сохраняя пробелы внутри аргументов. Он подходит для использования в таких контекстах, как:

     echo "You said, '$*'" 

    где предельная точность исходной командной строки не имеет решающего значения.

    Окончательное обозначение ${1+"$@"} – похмелье из прошлых дней, которое вы можете встретить в старых сценариях оболочки. Когда-то давно (и давным-давно – как и 30 лет назад) оболочка Борна обрабатывала "$@" как единственный пустой аргумент, когда аргументов не было. Это не было поведение в течение длительного времени, но некоторые сценарии, написанные очень давно, могут по-прежнему защитить себя, используя эту нотацию. Обозначение ${1+X} означает «если $1 установлено на что угодно, даже пустую строку, тогда укажите значение X В обсуждаемой нотации X является "$@" , который представляет собой список аргументов, когда известно, что он по крайней мере один – и в противном случае аргументов нет. Что означает то же, что и "$@" в любой современной оболочке.

    Interesting Posts

    Какие средства командной строки доступны для тестирования веб-службы?

    Есть ли инструмент для отслеживания перерывов между перезагрузками?

    настройка чувствительности клавиатуры с помощью kbdrate

    Разархивировать определенные файлы из нескольких ZIP-файлов

    Монитор не выключается

    Только цветные файлы в соответствии с типами файлов?

    skip pam_fprintd.so с закрытой крышкой

    Вам нужно установить Java для работы в студии Android?

    Установлена ​​Fedora с двойной загрузкой рабочего стола Windows. Теперь я не могу получить полное разрешение монитора с помощью AMD Radeon HD 6450

    Linux 4.3 – Ожидание корневого устройства / dev / mmcblk0p1

    Bash: ошибка синтаксиса около неожиданного токена `) '

    Нет правила для создания target `include / config / auto.conf ', необходимого для` include / config / kernel.release'. Стоп

    Перенумерация окон в tmux

    Fedora 23: «обновление dnf» застряло в «Выполнение транзакции»

    Устройство уже установлено или ресурс занят

    Linux и Unix - лучшая ОС в мире.