Read Command-line Arguments in Shell Scripts
Для усвоения, создадим скрипт PositionalParameters.sh
со следующим содержимым:
- PositionalParameters.sh
#!/bin/bash echo "Script Name: $0" echo "First Parameter of the script is $1" echo "The second Parameter is $2" echo "The complete list of arguments is $@" echo "Total Number of Parameters: $#" echo "The process ID is $$" echo "Exit code for the script: $?"
Выполним его, с подстановкой четырех аргументов:
./PositionalParameters.sh learning command line arguments
Вывод:
Script Name: ./PositionalParameters.sh First Parameter of the script is learning The second Parameter is command The complete list of arguments is learning command line arguments Total Number of Parameters: 4 The process ID is 28479 Exit code for the script: 0
Также, следует учесть, что у аргументов есть ограничения максимальной длины в байтах. Получаем длину:
getconf ARG_MAX
2097152
Таким образом, можно передать 2097152 байт в качестве args
любой команде shell:
echo $(( $(getconf ARG_MAX) - $(env | wc -c) )) 2095296
POSIX предлагает дополнительно вычитать 2048 байт, чтобы процесс мог безопасно изменять свое окружение:
expr `getconf ARG_MAX` - `env|wc -c` - `env|wc -l` \* 4 - 2048 2093176
Если, по какой-то причине мы его превысим, то получим сообщение Argument list too long
. Например, данное сообщение может появиться, когда мы пытаемся удалить очень большое количество файлов командой: rm -rf /tmp/logs/*.log
. В таком случае, для удаления лучше воспользоваться циклической конструкцией:
for f in /tmp/logs/*.log; do rm "$f"; done
Кроме вышеперечисленных команд можно использовать команду xargs, которая строит списки аргументов и выполняет по ним команды Linux или Unix. Отобразим ограничения на длину командной строки, наложенные операционной системой (следующий вывод для Ubuntu):
xargs --show-limits --no-run-if-empty </dev/null Your environment variables take up 1858 bytes POSIX upper limit on argument length (this system): 2093246 POSIX smallest allowable upper limit on argument length (all systems): 4096 Maximum length of command we could actually use: 2091388 Size of command buffer we are actually using: 131072 Maximum parallelism (--max-procs must be no greater): 2147483647