Bash脚本不会设置环境变量

问题描述 投票:0回答:2

我想编写一个脚本,该脚本将使用标志/开关接受用户输入,然后从该数据中设置ENV变量。

#set_env.sh
!#/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=$PRINT_ENV
  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 [email protected] -t my_tokens

当我使用printenv检查ENV变量时,没有设置。

但是,当我运行相同的脚本并在其中放入export TEST=test作为要执行的第一行实际代码时,然后运行printenv,则脚本成功保存了ENV变量。

任何对此问题的见识,将不胜感激!

bash unix terminal environment-variables zsh
2个回答
0
投票

假设bash标记而不是zsh标记是正确的:

$#FOO 没有给出变量FOO中字符串的长度;而是展开$#,然后将字符串FOO附加到结果中。由于结果不是有效数字,因此当将此值视为参数时,-gt将失败。

bash中用于检查字符串长度的语法为${#FOO}

要便携地检查字符串是否为非空,请使用[ $#FOO -gt 0 ]代替[ -n "$FOO" ]


0
投票

如果您正在运行bash,并且您source一个需要zsh的脚本,则该脚本将在子shell中运行,而不管其来源是什么。

发生的事情是,尽管您的脚本is是由当前的bash shell生成的,但它会找到shebang行并指出您需要different shell来完成工作。然后,它作为一个单独的过程开始。

我建议您使用一个或另一个外壳程序,以使采购按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.