2016-09-16 98 views

回答

1

下面是#bash的解决方案。

unset IFS 
args=() i=0 
for var in $(compgen -e); do 
    printf -v 'args[i++]' -e%s=%s "$var" "${!var}" 
done 

我最初以为的想法是输出,因此printf的%Q是必要的,但不是这种情况只是建立一个参数数组时,因此它可以简化为这样:

unset IFS 
args=() 
for var in $(compgen -e); do 
    args+=("-e$var=${!var}") 
done 
3

您可以使用env -0得到一个空值终止的name=value对列表,并使用一个for循环迭代:

while IFS='=' read -r -d '' n v; do 
    printf "'%s'='%s'\n" "$n" "$v" 
done < <(env -0) 

上面的脚本使用进程替换,这是一个BASH功能。在旧壳上,您可以使用管线:

env -0 | while IFS='=' read -r -d '' n v; do 
    printf "'%s'='%s'\n" "$n" "$v" 
done 
+0

我已经看到这在另一个线程中被切断。它给出了一个语法错误,''./foo.sh:line 3:语法错误附近的意外标记'<'\ n ./foo.sh:line 3:'done <<(env -0)​​''' – Gajus

+0

是因为你没有使用'bash'。确保你使用'bash'来执行脚本。否则使用:'env -0 |而IFS ='='读-r -d''n v;做printf'{“name”:“%s”,“value”:“%s”} \ n'“$ n”“$ v”;完成“,避免进程替换。 – anubhava

+1

哦,我很傻。我一直忘记zsh。谢谢。 – Gajus