Zsh скрипт не будет устанавливать переменные окружения - PullRequest
0 голосов
/ 17 января 2020

Я хочу написать скрипт, который будет принимать пользовательский ввод с помощью флагов / переключателей, а затем устанавливать переменные ENV из этих данных.

Файл называется 'set_env. zsh'.

!#/bin/zsh
while getopts eilt option
do
  case "${option}"
  in
  e) ENVIRON=${OPTARG};;
  i) ID=${OPTARG};;
  l) LOGIN=${OPTARG};;
  t) TOKEN=${OPTARG};;
  esac
  echo $option
done

if [ $#ENVIRON -gt 0 ];then
  export PRINTER_ENV=$ENVIRON
  echo $PRINTER_ENV

elif [ $#ID -gt 0 ];then
  export PRINTER_ID=$ID
  echo $PRINTER_ID

elif [ $#LOGIN -gt 0 ];then
  export PRINTER_EMAIL=$LOGIN
  echo $PRINTER_EMAIL

elif [ $#PRINTER_TOKEN -gt 0 ];then
  export PRINTER_TOKEN=$TOKEN
  echo $PRINTER_TOKEN
fi

Чтобы выполнить скрипт:

source set_env.sh -e DEVELOPMENT -i printer_01 -l my_email@email.com -t my_tokens

Когда я проверяю переменные ENV с помощью printenv, ни одна из них не была установлена.

Однако, когда я запускаю тот же скрипт и просто ставлю export TEST=test внутри него в качестве первой фактической строки кода, которая должна быть выполнена, а затем выполните printenv после того, как скрипт успешно сохранит переменные ENV.

Любое понимание этого вопроса будет высоко оценено!

1 Ответ

2 голосов
/ 17 января 2020

Ваша строка getopts не допускает аргументов параметров.

Измените ее с:

while getopts elit option

на:

while getopts e:l:i:t option

... сообщить getopts, что аргументы-опции ожидаются после каждого из -e, -l, -i или -t. В противном случае getopts выходит из l oop (возвращая значение false) при первом обнаружении неопции (как, например, в вашем примере, строка DEVELOPMENT) в списке аргументов.


Также для улучшения совместимости с оболочками, отличными от zsh, рассмотрите возможность изменения:

# This is zsh-only
if [ $#FOO -gt 0 ]; then

... на ...

# This works on all POSIX-family shells, and also some non-POSIX shells like zsh
if [ -n "$FOO" ]; then
...