首页 > 解决方案 > 使用 bash 从 ubuntu 上的文件中读取具有未转义字符的 env 变量

问题描述

如何在 bash 中读取包含空格和可能需要转义的其他字符的环境变量?

我有一个文件 server.env

PUBLIC_KEY=ssh-rsa whatever+whatever+8whatever/whatever+p+whatever user@alans-MacBook-Pro.local

我正在尝试将此文件作为环境变量读入 bash 脚本:

export $(cat server.env | xargs)

我收到一个错误:

-bash: export: `user@alans-MacBook-Pro.local': not a valid identifier

好的,尝试引用 server.env 中的值:

PUBLIC_KEY='ssh-rsa whatever+whatever+8whatever/whatever+p+whatever user@alans-MacBook-Pro.local'

双引号:

PUBLIC_KEY="ssh-rsa whatever+whatever+8whatever/whatever+p+whatever user@alans-MacBook-Pro.local"

我在这里想念什么?

标签: bashubuntuenvironment-variables

解决方案


Bash 提供带有子字符串删除的参数扩展,这将允许您分离NAME=value从文件中读取的对server.env,然后exportNAME=value对。

您只需要一个简单的读取循环:

#!/bin/bash

while read -r line; do              ## read each line of server.env
    val="${line#*=}"                ## trim to 1st =, save in val
    export ${line%=$val}="$val"     ## remove =$val leaving name, export val with name
done < server.env

printf "%s\n" "$PUBLIC_KEY"         ## confirm

示例使用/输出

$ bash test.sh
ssh-rsa whatever+whatever+8whatever/whatever+p+whatever user@alans-MacBook-Pro.local

其中基本参数扩展是:

${var#pattern}      Strip shortest match of pattern from front of $var
${var##pattern}     Strip longest match of pattern from front of $var
${var%pattern}      Strip shortest match of pattern from back of $var
${var%%pattern}     Strip longest match of pattern from back of $var

注意: pattern可以包含普通的 shell glob,比如'*'and '?'

实际上有几十个有用的参数扩展可以用于字符串操作。只需检查标题man bash下。"Parameter Expansion"


推荐阅读