2016-08-11 2 views
0

я узнать код оболочки из видео, и есть код:Expr и сосчитать в оболочке

#!/bin/sh 

i=1 

while true 
do 
    echo $i 
    i='expr $i + 1' 
done 

Код выше дает мне результат:

1 
expr $i + 1 
expr $i + 1 
expr $i + 1 
...... 

Но в видео вывод последовательных чисел, почему тот же код показывает разные результаты?

+2

Чтобы оценить _command_ в RHS присвоения переменной, вы должны заключить его в _backticks_ ('\' ... \ '') или, предпочтительно, '$ (...)'. Включение чего-то в цитаты _single_ заставляет содержимое строки быть взято _literally_. – mklement0

+0

'$ (...)' не обязательно будет работать в этом случае, потому что OP, похоже, использует 'sh'. Только в системах, где sh связан с, скажем, 'bash', это сработает. – user1934428

ответ

2

Как указано в комментарии, у вас есть неправильные цитаты; видео будет иметь обратные выходы (`, ASCII 96), а не одинарные кавычки (', ASCII 39).

Кроме того, все, что использует этот устаревший синтаксис для подстановки команд или expr, составляет по меньшей мере 20 лет назад, и его следует избегать в пользу современных конструкций POSIX.

#!/bin/sh 

i=1 

while true 
do 
    echo "$i" # Note proper quoting 
    i=$((i+1)) 
done 

В Bash, вы можете использовать расширение скобки или цикл C-стиль for, но они не являются переносимыми современной sh.

Если вам нужен ваш код для портативных систем до POSIX, моя рекомендация по-прежнему заключается в том, чтобы сначала изучить современные конструкции, особенно для простого кода, подобного этому (где в производственной системе вы, вероятно, захотите использовать Awk или Perl для такой петли в любом случае).

+0

о, спасибо! Я забыл использовать разные цитаты! – FrostL

Смежные вопросы