Skip to main content

Как передать аргументы в скрипт Bash

Как написать скрипт для Linux (Ubuntu) - передача параметров при запуске скрипта. (Май 2025)

Как написать скрипт для Linux (Ubuntu) - передача параметров при запуске скрипта. (Май 2025)
Anonim

Вы можете написать сценарий bash так, чтобы он получал аргументы, указанные при вызове сценария из командной строки. Этот метод используется, когда скрипт должен выполнять несколько другую функцию в зависимости от значений входных параметров (аргументов).

Например, у вас может быть сценарий под названием «stats.sh», который выполняет определенную операцию над файлом, например, подсчет его слов. Если вы хотите использовать этот скрипт для многих файлов, лучше передать имя файла в качестве аргумента, чтобы вы могли использовать один и тот же скрипт для всех файлов, которые должны быть обработаны. Например, если имя файла, подлежащего обработке, является «списком песен», вы должны ввести следующую командную строку:

Список песен sh stats.sh

Аргументы доступны внутри скрипта с использованием переменных $ 1, $ 2, $ 3 и т. Д., Где $ 1 относится к первому аргументу, $ 2 ко второму аргументу и т. Д. Это показано в следующем примере:

FILE1 = $ 1wc $ FILE1

Для удобства чтения присвойте переменной с описательным именем значение первого аргумента ($ 1), а затем вызовите функцию подсчета слов (wc) для этой переменной ($ FILE1).

Если у вас есть переменное количество аргументов, вы можете использовать переменную «$ @», которая представляет собой массив всех входных параметров. Это означает, что вы можете использовать for-loop для итеративного процесса каждого из них, как показано в следующем примере:

для FILE1 в "$ @"делатьwc $ FILE1сделанный

Вот пример того, как вызвать этот скрипт с аргументами из командной строки:

sh stats.sh songlist1 songlist2 songlist3

Если аргумент имеет пробелы, вам нужно заключить его в одинарные кавычки. Например:

sh stats.sh 'songlist 1' 'songlist 2' 'songlist 3'

Часто скрипт написан таким образом, что пользователь может передавать аргументы в любом порядке с использованием флагов. С помощью метода flags вы также можете сделать некоторые из аргументов опционными.

Скажем, у вас есть сценарий, который извлекает информацию из базы данных на основе указанных параметров, таких как «имя пользователя», «дата» и «продукт», и генерирует отчет в указанном «формате». Теперь вы хотите написать свой скрипт, чтобы вы могли передавать эти параметры при вызове сценария. Это может выглядеть так:

makereport -u jsmith -p notebooks -d 10-20-2011 -f pdf

Bash позволяет использовать эту функцию с функцией getopts. В приведенном выше примере вы можете использовать getopts следующим образом:

while getopts u: d: p: f: optionделатьcase "$ {option}"вu) USER = $ {OPTARG} ;;d) DATE = $ {OPTARG} ;;p) PRODUCT = $ {OPTARG} ;;f) FORMAT = $ OPTARG ;;ESACсделанный

Это цикл while, который использует функцию getopts и так называемую «optstring», в данном случае «u: d: p: f:», чтобы перебирать аргументы. Прогулка while проходит через optstring, которая содержит флаги, которые могут использоваться для передачи аргументов, и присваивает значение аргумента, предоставленного для этого флага, переменной «option». Затем оператор case присваивает значение переменной «option» глобальной переменной, которая может использоваться после того, как все аргументы были прочитаны.

Двоеточия в optstring означают, что для соответствующих флагов требуются значения. В приведенном выше примере за всеми флагами следует двоеточие: «u: d: p: f:». Это означает, что для всех флагов требуется значение. Если, например, ожидалось, что флаги «d» и «f» не будут иметь значения, optstring будет «u: dp: f».

Двоеточие в начале optstring, например «: u: d: p: f:», имеет совершенно другое значение. Он позволяет обрабатывать флаги, которые не представлены в optstring. В этом случае значение переменной «option» равно «?» а значение «OPTARG» установлено на неожиданный флаг. Позволяет отобразить соответствующее сообщение об ошибке, информирующее пользователя об ошибке.

Getupts игнорируются аргументы, которым не предшествует флаг. Если флаги, указанные в optstring, не предоставляются при вызове сценария, ничего не происходит, если вы специально не обрабатываете этот случай в своем коде. Любые аргументы, которые не обрабатываются getops, все равно могут быть захвачены с помощью обычных переменных $ 1, $ 2 и т. Д.