unix中的“$ a”和$ a有什么区别[重复]

最后发布: 2013-07-11 05:15:05


问题

这个问题在这里已有答案:

例如:

#!/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*

上面提到的脚本给出了三角形的答案,而没有双引号,它在diff行上一个接一个地落下。

shell unix
回答

在将变量扩展为其值之后,除非变量在双引号内,否则将分词(即将值分隔为空白处的标记)和文件名通配符扩展。

例:

var='foo   bar'
echo No quotes: $var
echo With quotes: "$var"

将输出:

No quotes: foo bar
With quotes: foo   bar


回答

这里的区别在于参数如何传递给echo函数。 有效地" "将保留空白。

这个:

echo -n "$b "

被翻译成:

echo -n "<number><space>"

这个:

echo -n $b<space>

将忽略尾随空格并仅输出数字:

echo -n <number>

因此,删除输出所需的所有空格看起来“三角形”。


回答

您的脚本中存在错误:

  • 没有do 1日之后while
  • ; do 2次后while
  • 为什么星号在最后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=""