在以下代码中 echo $d 打印值 0
#!/bin/sh
printf "Enter the IP address: "
read server
a=":"
b="["
c="]"
d=$b$server$c
echo $d
如果您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”的文件。解决方案?在消耗变量时始终引用变量。
您已经在使用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
不带引号,然后带引号,看看会发生什么。