首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用bash从ubuntu上的文件中读取带有未转义字符的env变量

使用bash从ubuntu上的文件中读取带有未转义字符的env变量
EN

Stack Overflow用户
提问于 2021-01-24 04:10:41
回答 3查看 100关注 0票数 1

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

我有一个文件server.env

代码语言:javascript
运行
复制
PUBLIC_KEY=ssh-rsa whatever+whatever+8whatever/whatever+p+whatever user@alans-MacBook-Pro.local

我试图将这个文件作为环境变量读入bash脚本:

代码语言:javascript
运行
复制
export $(cat server.env | xargs)

我收到了一个错误:

代码语言:javascript
运行
复制
-bash: export: `user@alans-MacBook-Pro.local': not a valid identifier

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

代码语言:javascript
运行
复制
PUBLIC_KEY='ssh-rsa whatever+whatever+8whatever/whatever+p+whatever user@alans-MacBook-Pro.local'

  • 相同的错误

双引号:

代码语言:javascript
运行
复制
PUBLIC_KEY="ssh-rsa whatever+whatever+8whatever/whatever+p+whatever user@alans-MacBook-Pro.local"

  • 还错误

我在这里错过了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-24 06:45:07

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

只需要一个简单的read循环:

代码语言:javascript
运行
复制
#!/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

示例使用/输出

代码语言:javascript
运行
复制
$ bash test.sh
ssh-rsa whatever+whatever+8whatever/whatever+p+whatever user@alans-MacBook-Pro.local

其中基本参数展开是:

代码语言:javascript
运行
复制
${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球体,如'*''?')

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

票数 2
EN

Stack Overflow用户

发布于 2021-01-24 04:17:00

部分应答(不export,因此变量在以后的bash运行中不可用,仅在当前会话中):

代码语言:javascript
运行
复制
source server.env
票数 0
EN

Stack Overflow用户

发布于 2021-01-24 04:17:08

这里的问题是,字段分裂仍然发生在空格上。

你应该这么做:

代码语言:javascript
运行
复制
export "$(cat server.env)"

(即加双引号)。

对于多个变量,在行上循环如下:

代码语言:javascript
运行
复制
while read -r line
do
    export "$line"
done < server.env

如果这是在一个名为export.sh的脚本中,那么您还需要对当前进程中要设置的变量进行source

代码语言:javascript
运行
复制
source export.sh
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65867051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档