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

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

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 

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

  • Как сделать функцию доступной для команды `parallel` (GNU)?
  • Как сохранить данные, данные для функции на стандартном входе?
  • Как вы можете передавать параметры для работы в скрипте?
  • Символы имени действительной функции Shell
  • Ubuntu 16.04 Скрипты в файле /etc/profile.d
  • Функция, вызывающая другую функцию со списком аргументов, не работает
  • Можете ли вы выполнить функцию Bash с помощью команды `at`?
  • Как передать параметры 4..99 на другую функцию
  • 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 
    Interesting Posts

    Как я могу синхронизировать тома kmix и alsamixer максимум?

    Что происходит на каждом этапе процесса создания ядра Linux?

    Я хочу знать, как быстро сбросить (очистить) eMMc (SD). (dd слишком медленно!)

    Существует ли самый быстрый способ отключения системы?

    Безопасно ли использовать fd 3?

    добавление дополнительных треков с помощью sox и командной строки

    / proc / net / dev сообщает неверную информацию о трафике

    Установка Linux Mint (в режиме двойной загрузки) больше не загружается в Windows 10

    Не удалось загрузить драйвер USB-клавиатуры на машине Debian

    Могу ли я перемещаться по меню закрытия zsh с помощью vi-подобных клавиш hjkl?

    Удаляет ли rsync файлы в месте назначения, которые были удалены со стороны отправки?

    использование таймеров systemd вместо cron

    разница между установками Apache

    Написание программы для редактирования .txt данных – Python или Unix?

    Мониторинг питания системы Lenovo x3650 m5 (8871) на RHEL7

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