【发布时间】:2022-01-17 07:28:33
【问题描述】:
我正在尝试使用带有一个参数的 bash 脚本导出环境变量。我尝试使用 source 命令运行脚本,但它不起作用。
source ./script.sh dev
下面是我的示例脚本
#!/bin/bash
# Check 1 argument is passed with the script
if [ $# -ne 1 ]
then
echo "Usage : $0 AWS account: e.g. $0 dev"
exit 0
fi
# convert the input to uppercase
aws_env=$( tr '[:lower:]' '[:upper:]' <<<"$1" )
if ! [[ "$aws_env" =~ ^(DEV|UAT|TRN|PROD)$ ]]; then
# check that correct account is provided
echo "Enter correct AWS account: dev or uat or trn or prod"
exit 0
else
# export environment variables
file="/home/xyz/.aws/key_${aws_env}"
IFS=$'\n' read -d '' -r -a lines < $file
export AWS_ACCESS_KEY_ID=${lines[0]}
export AWS_SECRET_ACCESS_KEY=${lines[1]}
export AWS_DEFAULT_REGION=ap-southeast-2
echo "AWS access keys and secret has been exported as environment variables for $aws_env account"
fi
文件 /home/xyz/.aws/key_DEV 的内容。它只是一个示例,不是真正的键。
$ cat key_DEV
123
xyz
当我说它不起作用时,终端没有任何反应,当我运行脚本时它会关闭终端。
进一步更新:
当我从没有源 (./script.sh dev) 的终端按原样运行脚本时,它似乎工作正常,通过调试 (set -x),我可以看到所有输出都是正确的。
但是,问题是当我使用源 (source ./script.sh dev) 运行时,它失败了(关闭终端,现在我知道原因了,因为退出 0),并且从调试命令捕获的输出中我可以看到它没有正确捕获 $1 参数。错误消息"Enter correct AWS account: dev or uat or trn or prod"。并且,$aws_env 变量的值为空。
我不知道为什么这两种行为不同以及如何解决它。
最终更新:
脚本看起来不错。这个问题是我电脑的本地问题。 tr 被定义为导致问题的 .bashrc 文件中的别名。我只是使用typeset -u aws_env="$1" 而不是aws_env=$( tr '[:lower:]' '[:upper:]' <<<"$1" )。感谢大家帮助我解决这个问题,特别是@markp-fuso。
【问题讨论】:
-
请将
/home/xyz/.aws/key_DEV的内容添加到您的问题中(此处不做评论)。 -
将
exit替换为return,因为该脚本旨在获取源代码。否则它可能会在获取时退出当前shell。 -
请更新问题,除了“它不起作用”;错误信息?没有输出?输出错误?
AWS_*变量已设置但未导出?还有什么? -
文件中只有两行;不要乱用
read的非标准功能来填充这两个变量。只需使用{ IFS= read -r AWS_ACCESS_KEY; IFS= read -r AWS_SECRET_ACCESS_KEY; } < "$file"。 -
终于解决了。感谢@markp-fuso 不断尝试让我一次又一次地回到正确的轨道上。其他对我有帮助的帖子@M。 Nejat Aydin 将出口更改为返回,这停止关闭终端,我可以看到调试输出。 @chepner 提供了如何调试 shell 脚本的链接。问题是我在 .bashrc 中定义了一个名为 tr 的别名,调试输出显示了它。一旦我将 'aws_env=$( tr '[:lower:]' '[:upper:]' typeset -u aws_env="$1",它就可以正常工作了。
标签: bash variables arguments environment script