将“-a”字符串分配给变量不起作用

时间:2011-05-23 16:04:22

标签: bash

$ OPTION="-n"
$ echo $OPTION
$

什么都没发生。我期待这一点。

$ OPTION="-n"
$ echo $OPTION
-n
$

为什么会这样?

3 个答案:

答案 0 :(得分:5)

-n是echo的参数,这意味着尾部换行被抑制。 $ echo $OPTION与以下$之间没有空行的事实意味着$ OPTION已正确设置为-n

如果你在$ OPTION前放置了其他内容,那么echo将按照您的预期运行。 echo仅将命令开头的单词解释为选项。一旦找到非选项字(在这种情况下为“OPTION”),后面的所有单词都会被视为文字,而不会被解析为echo的选项。

$ echo OPTION is set to $OPTION
OPTION is set to -n
$

答案 1 :(得分:2)

请记住,shell在执行命令之前会扩展环境变量。因此:

option="-n"
echo $option

变为

echo -n ""

$option的值解释为echo命令的参数。如果您使用Kornshell(与BASH 95%相似),您可以使用内置print命令:

option="-n"
print -- "$option"

不幸的是,BASH没有print命令,并且在BASH echo命令中使用双短划线将打印出双短划线 - 而不是你想要的。

相反,你必须使用比printf慢一点的echo命令:

option="-n"
printf -- "$option\n"  #Must include the \n to make a new line!

当然,如果你有这个,你就会遇到麻烦:

option="%d"
printf -- "$option\n"

解决这个问题:

option="%d"
printf "%s\n", "$option"

顺便说一句,你在测试中遇到了同样的问题:

option="-n"
if [ "$option" -eq "-n" ]   #Won't work!

这就是为什么你会看到人们这样做的原因:

if [“x $ option”-eq“x-n”] #Will work

答案 2 :(得分:0)

要获得所需的结果,您可以这样做:

$ OUTPUT='-n'
$ echo -en ${OUTPUT}\\n