在Unix中,"$a"和$a有什么区别?

6

例如:

#!/bin/sh
a=0
while [ "$a" -lt 10 ]
   b="$a"
   while [ "$b" -ge 0 ] do
      echo -n "$b "
     b=`expr $b - 1`
   done
   echo
   a=`expr $a + 1`
done*

上述脚本在三角形中给出答案,而没有双引号的话,它会一个接一个地落在不同的行上。

1
注意:在某些系统上,“echo -n”不会在所有shell上以相同的方式工作,这只会输出“-n”,而不是抑制换行符。 - user743382
3个回答

10
在变量被展开为其值后,将进行单词拆分(即在空格处将值分隔为标记)和文件名通配符扩展,除非该变量位于双引号内。
示例:
var='foo   bar'
echo No quotes: $var
echo With quotes: "$var"

将输出:

No quotes: foo bar
With quotes: foo   bar

4
这里的区别在于如何将参数传递给echo函数。实际上," "会保留空格。
这样写:

echo -n "$b "

Is translated to:

echo -n "<number><space>"

虽然这样做:

echo -n $b<space>

会忽略尾随空格并只输出数字:
echo -n <number>

因此,需要删除所有用于使输出“三角形”效果的空格。

不仅仅是保留空格的问题。考虑当 b='*' 的情况。 - Charles Duffy

0

您的脚本中存在错误:

  • 第一个while后没有do
  • 第二个whiledo前没有;
  • 为什么在done*末尾有星号?

现在回答您的问题。

  • 如果作为参数使用:"$a"是一个参数。
  • $a(不带引号)可能是多个参数:

比较:

v='a b';  set $v; echo "\$#=$#, \$1=\"$1\",  \$2=\"$2\""  
$#=2, $1="a",  $2="b"

v='a b'; set "$v"; echo "\$#=$#, \$1=\"$1\",  \$2=\"$2\""  
$#=1, $1="a b",  $2=""

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接