User Tools

Site Tools


arguments_in_shell_scripts

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
arguments_in_shell_scripts.txt · Last modified: 2023/04/06 10:28 (external edit)