Характер позиционных параметров

Я начинаю писать сценарии и писать этот скрипт, который немного меня смутил …

function func { the variables received are echo $0: $1 and $2 } echo in the main script func ball boy 

Имя скрипта – shell.txt. Я ожидал, что результат будет

 func : ball and boy 

Однако я получил

 ./shell.txt :ball and boy 

Я прочитал, что позиционные параметры являются «локальными» в природе, тогда как этот результат пришел?

2 Solutions collect form web for “Характер позиционных параметров”

В bash зарезервированы некоторые переменные, такие как $ 0, который дает имя команды – в этом случае это имя скрипта (отсюда ./shell.txt). Другим примером является $$, который даст идентификатор процесса. Я считаю, что $ FUNCNAME должен печатать имя используемой функции.

Любые переменные в формате $ 1 $ 2 $ 3 и т. Д. Будут любыми позиционными параметрами, которые вы ему передали.

Если вы удалили переменную $ 0 и заменили ее на $ FUNCNAME, вы получили бы результат, который вы ищете.

Вот короткий скрипт, давайте сохраним его как passVariables.sh (мы используем .sh, чтобы показать, что это скрипт оболочки – чисто поверхностный, но он помогает держать вещи в чистоте):

 #!/bin/bash echo "The first word is $1 and the second word is $2" 

Теперь, если я запустил его так:

 ./passingVariables.sh apple orange 

Это будет означать следующее:

 "The first word is apple and the second word is orange" 

Поведение зависит от оболочки.

Вы объявили функцию не POSIX. Портативный синтаксис был бы

 func() { ... 

Вероятно, вы использовали bash для запуска вашего скрипта. bash имеет никакого значения между стандартным синтаксисом, который вы использовали, и стандартным. В обоих случаях $0 относится к имени скрипта.

Если вы использовали реализацию ksh AT & T или общедоступного домена, которая вводила используемый вами синтаксис и обрабатывала функции, объявленные с помощью токена function , вы бы заметили поведение, которое вы ожидали:

 $ cat go function func { echo $0: $1 and $2 } func1() { echo $0: $1 and $2 } func ball boy func1 ball boy $ bash go go: ball and boy go: ball and boy $ ksh go func: ball and boy go: ball and boy 
  • Как сделать функцию доступной для команды `parallel` (GNU)?
  • Как получить функции, распространяемые на подоболочку?
  • Можете ли вы выполнить функцию Bash с помощью команды `at`?
  • Bash псевдоним с пространством в составе команды
  • функция bash для переноса программы и иногда добавить аргумент
  • strace не находит функцию оболочки с ошибкой «Can not stat»
  • Значение, назначенное внутри функциональной переменной, всегда пусто
  • Почему вы должны быть осторожны при использовании встроенной функции истории Bash для повторного запуска предыдущих команд, содержащих переменные?
  • sh - Использование аргументов в .profile-функциях
  • Выполнять команду, предоставляемую параметрами функции
  • Передавать аргументы для функции точно как-есть
  • Ubuntu 16.04 Скрипты в файле /etc/profile.d
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.