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

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

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

Например

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

  • Не удается получить доступ к внешнему жесткому диску.
  • Как отключить трассировки bash?
  • Командная строка: <<< вместо <<
  • Как перезапустить фоновое задание не удалось из-за «сломанной трубы»
  • Для одного и того же пользователя unix или linux разные наборы переменных среды
  • , / path / to / a / shell-script-file? (в сценарии оболочки)
  • В zsh как я могу перечислить все переменные среды?
  • Где я могу изменить свою оболочку?
  • 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 является "$@" , который представляет собой список аргументов, когда известно, что он по крайней мере один – и в противном случае аргументов нет. Что означает то же, что и "$@" в любой современной оболочке.

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