1

在以下代码中 echo $d 打印值 0

#!/bin/sh
printf "Enter the IP address: "
read server
a=":"
b="["
c="]"
d=$b$server$c
echo $d
4

2 回答 2

1

如果您echo是一个变量而不引用它,则内容会受到全局扩展的影响。shell 将一个由左方括号和右方括号以及它们之间的东西组成的 glob 视为一种模式,它是其中任何字符的选择。

这是一个演示:

$ mkdir newdir
$ cd newdir
$ var='[192.168.0.1]'
$ echo $var     # unquoted
[192.168.0.1]
$ touch 0
$ echo $var     # unquoted
0
$ echo "$var"   # quoted
[192.168.0.1]

如您所见,目录中有一个touch名为“0”的文件(在命令之后)。方括号内有一个“0”匹配。方括号内的字符序列很简单,不是字符串(当变量不加引号时),但重复项被忽略。在这个例子中,[192.680]是等价的。

课程?您的目录中有一个名为“0”的文件。解决方案?在消耗变量时始终引用变量。

于 2012-05-18T02:14:45.680 回答
1

您已经在使用printf. 使用printf而不是echo. 这工作得很好:

printf "Enter the IP address: "
read server
a=":"
b="["
c="]"
d="${b}${server}${c}"
printf "%s\n"  $d

每当您遇到问题时echo,您都可以printf像我展示的那样使用它。其实我推荐你用它来代替echo。这是一个例子:

echo -n "Enter a string: "
read string
echo "$string"

看起来很简单,但是如果我-foo作为字符串输入呢?回声将失败。但是,这将起作用:

printf "%s" "Enter a string: "
read string
printf "%s\n" $string

无论您输入什么$string

我确实$d通过使用引号和花括号更改了设置。如果您在设置时不使用引号d,并且有人输入this * is a string您的 IP 地址,您的程序将扩展*以匹配目录中的所有文件。可能是你不想要的东西。花括号只是让变量像这样混合在一起时更容易看到。另外,它可能会将每个单词放在自己的行中。

输入this * is a test您的 IP 地址并尝试设置$d不带引号,然后带引号,看看会发生什么。

于 2012-05-18T05:16:52.213 回答