как объявить переменные командной строки в сценариях оболочки?

Я хочу объявить переменную как аргумент командной строки для сценария оболочки так же, как

./script.sh

file=/tmp/domains.txt domain=abcd.com** 

Помогите сделать то же самое.

Вы можете передать эти переменные, указав их перед именем команды; например

 file=/tmp/domains.txt domain=abcd.com ./script.sh 

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

Передача таких переменных, как это работает, требует от пользователя понимания внутренних компонентов вашего скрипта. Это может также вызвать странное, казалось бы необъяснимое поведение, если переменные будут определены в среде по какой-либо другой причине, совершенно не связанной с вашим сценарием (и пользователь забывает установить их в командной строке при запуске скрипта).

Лучший способ сделать это – использовать встроенный синтаксический анализ оболочки, getopts . Например:

 usage() { # print some help text here, eg echo Usage: echo " $0 [-f filename] [-d domainname]" } # -f and -d are the only valid options and they both # take strings as arguments. while getopts f:d: opt; do case "$opt" in f) file="$OPTARG" ;; d) domain="$OPTARG" ;; *) usage ; exit 1 ;; esac done shift $(expr $OPTIND - 1) # print help message and exit if either file or domain are # empty. [ -z "$file" ] && usage && exit 1 [ -z "$domain" ] && usage && exit 1 

Для получения более подробной информации см. Справочную страницу вашей оболочки (например, man bash или man dash ). Встроенная в help команда bash также предоставляет полезную информацию о getopts – то есть help getopts

Если вы хотите использовать длинные опции в стиле GNU (например, --file , --domain ), а также короткие -f и -d , вы можете использовать программу getopt из util-linux . Обратите внимание, что это getopt без «s», а встроенный – getopts с «s».

Обычно я использую util-linux getopt потому что мне нравится иметь – длинные варианты …. но getopts является стандартным и не требует ничего дополнительного для установки, потому что он встроен в каждую совместимую с posix оболочку и будет работа с bash, тире, ksh и т. д.