Аргументы могут быть полезны, особенно с Bash!
До сих пор вы узнали, как использовать переменные, чтобы сделать ваши сценарии bash динамическими и универсальными, чтобы они реагировали на различные данные и различный ввод пользователя.
В этой статье вы узнаете, как передавать переменные в сценарии bash из командной строки.
Передача аргумента сценарию оболочки bash
Следующий скрипт count_lines.sh выведет общее количество строк, которые существуют в любом файле, который пользователь вводит:
#!/bin/bash echo -n "Пожалуйста, введите имя файла: " read filename nlines=$(wc -l < $filename) echo "В $filename есть строки $nlines"
Например, пользователь может войти в файл, /etc/passwd и в результате скрипт выдаст количество строк:
Этот сценарий отлично работает; однако есть гораздо лучшая альтернатива!
Вместо того, чтобы запрашивать у пользователя имя файла, мы можем заставить пользователя просто передать имя файла в качестве аргумента командной строки при запуске скрипта следующим образом:
./count_lines.sh /etc/passwd
К первому аргументу bash (также известному как позиционный параметр) можно получить доступ в вашем сценарии bash с помощью переменной $1.
Итак, в сценарии count_lines.sh вы можете заменить имя файла $1 следующим образом:
#!/bin/bash nlines=$(wc -l < $1) echo "В $1 есть строки $nlines"
Обратите внимание, что мы также избавились от команд чтения и первого эха, поскольку они больше не нужны!
Наконец, вы можете запустить скрипт и передать любой файл в качестве аргумента:
./count_lines.sh /etc/group There are 73 lines in /etc/group
Передача нескольких аргументов в сценарий оболочки bash
Вы можете передать вашему сценарию bash более одного аргумента. В общем, вот синтаксис передачи нескольких аргументов любому сценарию bash:
script.sh arg1 arg2 arg3 …
На второй аргумент будет ссылаться переменная $2, на третий аргумент будет ссылаться $3, .. и т. д.
Переменная $0 содержит имя вашего скрипта в случае, если вам интересно!
Теперь мы можем отредактировать наш bash-скрипт count_lines.sh, чтобы он мог подсчитывать строки более чем одного файла:
#!/bin/bash n1=$(wc -l < $1) n2=$(wc -l < $2) n3=$(wc -l < $3) echo "В $1 есть строки $n1" echo "В $2 есть строки $n3" echo "В $3 есть строки $n3"
Теперь вы можете запустить сценарий и передать три файла в качестве аргументов сценарию bash:
Как видите, скрипт выводит количество строк каждого из трех файлов; и излишне говорить, что порядок аргументов, конечно, имеет значение.
Творческий подход с аргументами в оболочке Bash
Некоторые из них немного сложные, поскольку могут иметь длинный синтаксис или длинный набор опций, которые вы можете использовать.
К счастью, вы можете использовать аргументы bash, чтобы превратить сложную команду в довольно простую задачу!
Чтобы продемонстрировать это, взгляните на следующий find.sh сценарий bash:
#!/bin/bash find / -iname $1 2> /dev/null
Это очень простой сценарий, который, тем не менее, может оказаться очень полезным! Вы можете указать любое имя файла в качестве аргумента сценария, и он отобразит местоположение вашего файла:
Вы видите, что теперь это намного проще, чем вводить всю команду find! Это доказательство того, что вы можете использовать аргументы, чтобы превратить любую длинную сложную команду в Linux в простой сценарий bash.
Если вам интересно 2> /dev/null, это означает, что любое сообщение об ошибке (например, невозможно получить доступ к файлу) не будет отображаться на экране.
Дополнительный совет: специальные переменные в оболочке Bash
Bash имеет множество встроенных специальных переменных, которые очень удобны и доступны в вашем распоряжении.
В таблице ниже представлены наиболее распространенные специальные встроенные переменные bash:
Специальная переменная | Описание |
---|---|
$0 | Имя сценария bash. |
$1, $2 … $n | Аргументы сценария bash. |
$$ | Идентификатор процесса текущей оболочки. |
$# | Общее количество аргументов, переданных скрипту. |
$@ | Значение всех аргументов, переданных скрипту. |
$? | Статус выхода последней выполненной команды. |
$! | Идентификатор процесса последней выполненной команды. |
Чтобы увидеть эти специальные переменные в действии; взгляните на следующий variables.sh сценарий bash:
#!/bin/bash echo "Название сценария: $0" echo "Общее количество аргументов: $#" echo "Значения всех аргументов: $@"
Теперь вы можете передать любые аргументы и запустить скрипт.
Хорошо, на этом мы подошли к концу урока на этой неделе. Надеюсь, теперь вы понимаете, насколько мощными и полезными могут быть аргументы bash; Следите за обновлениями на следующей неделе, поскольку я собираюсь показать, что вы можете создавать и использовать массивы в своих сценариях bash .