我試圖找出如何三立和便攜(儘可能)處理與不映射到有效的shell變量名環境變量。關鍵的是結果是逐字節準確的,所以我不願意通過解析輸入env
工具等黑客行爲。訪問環境變量沒有映射到有效的shell變量名
env 'Invalid Name=Some Value' bash <<'EOF'
s='Invalid Name'
printf '%q\n' "${!s}"
EOF
我希望上面的代碼會發出Some Value
;不過,它會返回一個空字符串。
我試圖找出如何三立和便攜(儘可能)處理與不映射到有效的shell變量名環境變量。關鍵的是結果是逐字節準確的,所以我不願意通過解析輸入env
工具等黑客行爲。訪問環境變量沒有映射到有效的shell變量名
env 'Invalid Name=Some Value' bash <<'EOF'
s='Invalid Name'
printf '%q\n' "${!s}"
EOF
我希望上面的代碼會發出Some Value
;不過,它會返回一個空字符串。
一個不可移植的方法(僅限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"]}"
我不明白的問題:如何定義的環境變量有一個非有效的名稱? ...我很困惑^^ –
環境是一個操作系統的結構,而不是任何特定的shell。殼只提供了一種機制來將其變量導出到環境中,並且有可能一個shell的有效變量名的概念與另一個不同,它既不包含所有有效的環境變量名。例如,請參閱POSIX規範(http://pubs.opengroup.org/onlinepubs/7908799/xbd/envvar.html)中的定義,該定義指出不允許包含有效字符的環境變量必須是可容忍的,否則必須允許公認。 – chepner
或者更簡單的例子,只需運行'env「foo bar = 3」env | grep foo' – chepner