从带有参数的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:]' &lt;&lt;&lt;"$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; &lt; "$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 私钥

如何从 Ant 'exec' 任务中导出环境变量?

Bash:将带有空变量的“$@”参数传递给 sudo -i

Bash基础——Shell脚本内部常用环境变量

oracle环境变量bash_profile设置问题,最后几行出现乱码!编辑时按backspace键,后面自动多出一些参数。

我可以将变量从 Bash 脚本导出到环境而不使用它吗?