我想编写一个脚本,该脚本将使用标志/开关接受用户输入,然后从该数据中设置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标记而不是zsh标记是正确的:
$#FOO
没有给出变量FOO
中字符串的长度;而是展开$#
,然后将字符串FOO
附加到结果中。由于结果不是有效数字,因此当将此值视为参数时,-gt
将失败。
bash中用于检查字符串长度的语法为${#FOO}
。
要便携地检查字符串是否为非空,请使用[ $#FOO -gt 0 ]
代替[ -n "$FOO" ]
。
如果您正在运行bash
,并且您source
一个需要zsh
的脚本,则该脚本将在子shell中运行,而不管其来源是什么。
发生的事情是,尽管您的脚本is是由当前的bash
shell生成的,但它会找到shebang行并指出您需要different shell来完成工作。然后,它作为一个单独的过程开始。
我建议您使用一个或另一个外壳程序,以使采购按预期工作。