我有以下bash脚本。它实际上是一个环境变量文件,其中包含一些环境变量,我想根据我在获取源变量时传递的参数来设置这些环境变量。这是MWE。
#!/usr/bin/env bash
# CONSTANTS
PROD_STR='prod'
TEST_STR='test'
# Set the environment: 'prod' or 'test'
if [ "$1" == $PROD_STR ] || [ "$1" == $TEST_STR ]; then
export DEV_ENV=$1
echo "Found valid dev environment: "$DEV_ENV
else
echo "No valid environment specified"
echo "Usage: env_vars <env>"
echo ' env - one of "prod" or "test"'
fi
case $DEV_ENV in
$PROD_STR)
export MY_HOST='fooProd.net'
export PORT='8000';;
$TEST_STR)
export MY_HOST='fooTest.net'
export PORT='8100';;
esac
export API_USERNAME='foo'
export API_PASSWORD='mypwrd'
现在,我想source
这个已命名为test_env_var.sh
的文件。我尝试过。
source test_env_var.sh prod
它给了我以下test_env_var.sh:8: = not found
. ./test_env_var.sh prod
。
它仍然给我:./test_env_var:8: = not found
。
./test_env_var prod
现在,它运行时没有错误,并且回显了(应有的)输出
Found valid dev environment: prod
。
所以现在在执行完(3)之后,我希望看到我的env变量已设置。但是当我这样做
echo $API_USERNAME
它不返回任何内容。
解决方法
我在提示符下键入bash
暂时将$ SHELL更改为bash。然后我以
. test_env_var prod
现在,当我尝试echo
设置的任何env variable
时(例如echo $API_USERNAME
,它会按原样返回foo
)。即使我通过输入zsh
回到zsh
,环境变量仍然存在。
问题:
为什么会这样?如果不将$ SHELL更改为bash,我是否无法运行此bash脚本? bash脚本的语法可能需要更改,以便它可以在zsh
上运行。但这不是一个选择,因为此文件受版本控制。
更多上下文
我想我的zsh
和bash
都是usr/local/bin/
,所以shebang #!/usr/bin/env bash
应该照顾好这个问题。
答案 0 :(得分:1)
更改
if [ "$1" == $PROD_STR ] || [ "$1" == $TEST_STR ]; then
到
if [ "$1" = $PROD_STR ] || [ "$1" = $TEST_STR ]; then
==
是bash
的扩展名。 =
是标准的POSIX语法,bash
和zsh
都支持。