Echo 未打印变量的正确值

sha*_*r v 4 shell echo variable

我的 shell 脚本中有一个变量在运行时没有得到正确解析:

输入

#!/bin/sh
SERVER_ERL_ARGS="+K true +A30 +P 1048576 \
     -kernel inet_default_connect_options [{nodelay,true}]"
echo ${SERVER_ERL_ARGS}
Run Code Online (Sandbox Code Playgroud)

输出:

+K true +A30 +P 1048576 -kernel inet_default_connect_options a
Run Code Online (Sandbox Code Playgroud)

这种行为背后的任何原因以及我如何纠正它。

Kus*_*nda 15

您没有在您的 中引用变量扩展echo,并且您a在当前目录中调用了一个文件。

[{nodelay,true}]就像一个文件匹配模式,将匹配其名称是内任何单个字符的任何文件[...]。在您的情况下,它与a当前目录中调用的文件的名称相匹配。

所以,引用变量,但最好使用printf

printf '%s\n' "$SERVER_ERL_ARGS"
Run Code Online (Sandbox Code Playgroud)

另请注意,在所有情况下${variable}都完全等效,$variable除非扩展是字符串的一部分,其中紧随其后的字符在变量名称中有效,例如 in "${variable}x"

也可以看看:

  • @Philippos Brace 扩展发生在变量扩展之前。当变量被扩展时,其值中的大括号不会被扩展。这就是 `echo [{nodelay,true}]` 和 `v='[{nodelay,true}]' 之间的区别;回声 $v`。 (3认同)