Bash 访问不使用';t映射到有效的shell变量名

Bash 访问不使用';t映射到有效的shell变量名,bash,Bash,我试图弄清楚如何合理且可移植(尽可能多地)处理名称不映射到有效shell变量的环境变量。结果必须逐字节准确,这一点至关重要,因此我不愿意经历诸如解析env工具的输出之类的黑客行为 env 'Invalid Name=Some Value' bash <<'EOF' s='Invalid Name' printf '%q\n' "${!s}" EOF env'Invalid Name=Some Value'bash一种不可移植的方法(仅限Linux)是解析/proc/self/env

我试图弄清楚如何合理且可移植(尽可能多地)处理名称不映射到有效shell变量的环境变量。结果必须逐字节准确,这一点至关重要,因此我不愿意经历诸如解析
env
工具的输出之类的黑客行为

env 'Invalid Name=Some Value' bash <<'EOF'
s='Invalid Name'
printf '%q\n' "${!s}"
EOF
env'Invalid Name=Some Value'bash一种不可移植的方法(仅限Linux)是解析
/proc/self/environ

declare -A environ
while IFS='' read -r -d ''; do
  var=${REPLY%%=*}
  val=${REPLY#*=}
  environ[$var]="$val"
done </proc/self/environ
printf '%q\n' "${environ["Invalid Name"]}"
declare-A环境
而IFS=''read-r-d'';做
var=${REPLY%%=*}
val=${REPLY#*=}
环境[$var]=“$val”

我不明白这个问题:一个定义的环境变量怎么会有一个无效的名称。。。我很困惑^^环境是一个操作系统的构造,而不是任何特定的shell。shell只提供了一种将其变量导出到环境的机制,并且一个shell的有效变量名概念可能不同于另一个shell,两者都不包含所有有效的环境变量名。例如,请参阅POSIX规范()中的定义,其中规定,如果不接受,则必须容忍不包含有效字符的环境变量。或者,对于更简单的示例,只需运行
env“foo bar=3”env | grep foo
@OlivierDulac注意该示例,它使用
env
工具来创建这样一个变量。+1您可以从
env
命令而不是
/proc/self/environ
读取数据,以使其更具可移植性。@chepner是
env
命令的输出在引用、非ASCII字符等方面具有确定性的吗?我不知道答案。我怀疑这取决于实际的区域设置。