Вы можете написать сценарий 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 и т. Д.