2013-07-11 3 views
5

Например:

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

Примечание: «эхо -n» не работает так же, как на всех оболочках, на некоторых системах это будет просто выведите «-n» вместо подавления новой строки. – hvd

ответ

3

Здесь разница заключается в том, как аргумент передается функции echo. Эффективно " " сохранит пробелы.

Это:

echo -n "$b " 

переведен на:

echo -n "<number><space>" 

В то время как это:

echo -n $b<space> 

будет игнорировать замыкающую пространство и будет просто вывести номер:

echo -n <number> 

Поэтому удаление всех пространств, необходимых для вывода, выглядит «треугольным».

+0

Не только о сохранении пробелов. Рассмотрим случай, когда 'b = '*'' –

8

После того, как переменная расширяется до ее значения, разделение слов (т. Е. Разделение значения на токены в пробеле) и расширение подстановочного имени файла происходит, если переменная не находится внутри двойных кавычек.

Пример:

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

выведет:

No quotes: foo bar 
With quotes: foo bar 
0

Есть ошибки в вашем скрипте:

  • нет do после 1-го while
  • не ; перед тем do после 2-го while
  • Почему звездочка на done* в конце?

Теперь, чтобы ответить на ваш вопрос. При использовании в качестве paramenter:

  • "$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="" 
Смежные вопросы