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

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

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 

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

  • Выполнять команду, предоставляемую параметрами функции
  • Какие значения return / exit можно использовать в bash-функциях / скриптах?
  • Невозможно grep список заданий, когда задания, вызванные функцией
  • Значение, назначенное внутри функциональной переменной, всегда пусто
  • Как добавить функцию в .bash_profile / .profile / bashrc в оболочке?
  • Можете ли вы выполнить функцию Bash с помощью команды `at`?
  • Как сохранить данные, данные для функции на стандартном входе?
  • bash для выполнения команды в качестве аргумента
  • 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 
    Linux и Unix - лучшая ОС в мире.