从带有参数的bash脚本中导出环境变量
Posted
技术标签:
【中文标题】从带有参数的bash脚本中导出环境变量【英文标题】:export environment varible from bash script with argument 【发布时间】: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",它就可以正常工作了。
【参考方案1】:
尝试像这样使用mapfile
而不是read
...
#!/usr/bin/env 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
mapfile -t 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
确保您还在"$file"
周围加上引号
另一个小技巧,Bash 支持直接将变量设为大写,如下所示:
var="upper"
echo "$var^^"
【讨论】:
与 mapfile 的结果相同,它会关闭终端。 OH右,̶耶您̶̶s̶o̶u̶r̶c̶i̶n̶g̶
̶脚本,̶所以每当在bash运行内置̶̶e̶x̶i̶t̶
̶,̶它只是退出交互式的bash̶s̶e̶s̶s̶i̶o̶n̶.̶所以̶y̶o̶u̶'̶l̶l̶ ̶w̶a̶n̶t̶̶t̶o̶̶r̶e̶p̶l̶a̶c̶e̶̶t̶h̶e̶̶̶e̶x̶i̶t̶
̶s̶̶w̶i̶t̶h̶̶̶r̶e̶t̶u̶r̶n̶
̶s̶̶h̶e̶r̶e。刚刚看到您的编辑...以上是关于从带有参数的bash脚本中导出环境变量的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Bash/Terminal 中导出多行环境变量,例如:RSA 私钥
oracle环境变量bash_profile设置问题,最后几行出现乱码!编辑时按backspace键,后面自动多出一些参数。