У меня странное поведение при запуске скрипта с аргументами, содержащими подстановку команд. Я хотел бы понять, почему происходит такое поведение. Сценарий такой:

#!/bin/bash

# MAIL=$1
# USER=$2
PASSWORD=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-20} | head -n 1);
echo "$PASSWORD"

Затем запускаю: ./test.sh mail user, получаю ошибку: fold: invalid number of columns: ‘mail’ и пароль не генерируется.

Если я не передаю аргумент или не генерирую пароль, он работает нормально.

Обновление (для понимания поведения)

Думаю, я выяснил, что происходит: При запуске сценария с двумя аргументами $1 and $2 имеют переданные значения. Пример: ./test.sh arg1 arg2 имеют $1 -> arg1 и $2 -> arg2

При использовании конвейера внутри скрипта исходные аргументы все еще передаются, и поэтому, если у вас есть два аргумента в качестве входных данных, вы вставите конвейерный вывод в третье место $3.

  • $1 -> arg1
  • $2 -> arg2
  • $3 -> piped output Итак, рабочее решение:
PASSWORD=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${3:-20} | head -n 1);

Но если вы измените входные аргументы, это не сработает. Поэтому лучшее решение - это то, что предложил @KamilCuk:

PASSWORD=$(< /dev/urandom tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1);
0
Pulsar 10 Фев 2021 в 13:08

1 ответ

Лучший ответ

Если вы не хотите передавать первый аргумент сценария в fold, не используйте в нем $1.

PASSWORD=$(< /dev/urandom tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1);
#                                                      ^^ - pass the number, not $1
echo "$PASSWORD"
0
KamilCuk 10 Фев 2021 в 10:31