bash - 使用 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"
- 还有错误
我在这里想念什么?
解决方案
Bash 提供带有子字符串删除的参数扩展,这将允许您分离NAME=value
从文件中读取的对server.env
,然后export
是NAME=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"
推荐阅读
- python - TypeError:不支持 mat 数据类型 = 0
- java - 同步异步后端
- r - 如何通过创建手段将r中的长数据集转换为宽数据集
- replace - 如何在 textwrangler 搜索和替换中添加行号?
- javascript - 如何从 Javascript 中的 url 获取 #pg= 值?
- python - 在 PyTorch 中在 CPU(而不是 GPU)上对深度模型进行基准测试的最佳实践?
- javascript - 是否有设置在 CRA 的 URL 末尾添加斜杠?
- c# - w[警告]没有找到测试结果文件 azure devops
- java - Mockito 问题:org.mockito.exceptions.misusing.InvalidUseOfMatchersException:预期 1 个匹配器,记录 2 个:
- javascript - html2canvas 不渲染由 CHARTIST.JS 生成的 SVG 图表