如何在 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,如 '*'
和 '?'
)实际上有几十个有用的参数扩展可以用于字符串操作。只需检查
man bash
下"Parameter Expansion"
标题。
关于bash - 使用 bash 从 ubuntu 上的文件中读取具有未转义字符的 env 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65867051/