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

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

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

Например

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

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 является "$@" , который представляет собой список аргументов, когда известно, что он по крайней мере один – и в противном случае аргументов нет. Что означает то же, что и "$@" в любой современной оболочке.

  • Порядок выполнения с несколькими командами
  • Mx ansi-term colors в Emacs 24.x
  • Синтаксическая ошибка при попытке установить петлю оболочки nohup
  • Как определить, является ли вход из аргумента, файла или терминала
  • Использовать всю системную память в Solaris
  • Тип файла и разыменование при указании каталога с помощью команды LS
  • Мультиплексные копии scp
  • Почему расширение файла glob не подавляется
  • line (записи) Count и grep вместе в одной команде в dat-файле
  • что вы подразумеваете под интерактивной оболочкой?
  • Настройка переменных среды с .sh-файлом
  • Linux и Unix - лучшая ОС в мире.