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*

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

4

3 回答 3

9

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

例子:

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

将输出:

No quotes: foo bar
With quotes: foo   bar
于 2013-07-11T05:21:16.190 回答
4

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

这个:

echo -n "$b "

被翻译成:

echo -n "<number><space>"

虽然这样:

echo -n $b<space>

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

echo -n <number>

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

于 2013-07-11T05:21:04.497 回答
0

您的脚本中有错误:

  • do第一次之后没有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=""
于 2013-07-11T05:49:26.670 回答