Должен ли я использовать $ (()) для вычисления арифметических выражений в ksh? - PullRequest
5 голосов
/ 15 сентября 2011

1) Должен ли я использовать $ (()), если я оперирую целыми числами?

>typeset -i x=0
>typeset -i y=0
>typeset -i z=0
>y=$(($x+1))
>print $y
1
>z=$x+1
>print $z
1

Как видите, есть правильные результаты как по z, так и по y.
Только в случае, если переменная не была объявлена ​​как целое число, есть разница:

>typeset j
>typeset k
>j=$(($x+1))
>print $j
1
>k=$x+1
>print $k
0+1

2) В чем разница между $ (($ x + 1)) и $ ((x + 1))?

печать $ (($ x + 1))
1
печать $ ((x + 1))
1

Та же ситуация с let:

х = 1
пусть х = $ х + 1
распечатать $ x
2
пусть х = х + 1
печать $ x
3

Ответы [ 3 ]

2 голосов
/ 15 сентября 2011

2) С расширением $x в $((..)) вы можете создать текстовое выражение:

NUM1=3
NUM2=5
NUM3=7
for OP1 in + - \* /; do
  for OP2 in + - \* /; do
    echo $((NUM1 $OP1 NUM2 $OP2 NUM3));
  done
done

очевидно, что он не будет работать с $((NUM1 OP1 NUM2)) и т. Д.

Другая возможность (без $) может быть использована для изменения переменной:

X=0
Y=1
echo $((Y << (++X))) # prints 2, which is 1 << 1; increments X
echo $X # prints 1

Для 1) я бы использовал $((..)), поскольку это POSIX, однако я не думаю, что это имеет значение в ksh.

2 голосов
/ 15 сентября 2011

1) Должен ли я использовать $ (()), если я оперирую целыми числами?

Как и в большинстве случаев в программировании, "это зависит".Если вы думаете, что ваш код будет использоваться в старых системах Unix, где есть только оболочка Bourne, этот синтаксис не будет работать.

Если вы всегда будете в совершенно современной среде, то синтаксис $(( ... )) действительно имеет больше смысла, так как допускает лаконичные выражения и выражения на языке Си.

Кроме того,как указывают другие, для любых числовых переменных внутри $(( ... )) вы можете сохранить ввод и исключить начальный '$'.; -)

2) В чем разница между $ (($ x + 1)) и $ ((x + 1))?

Как указано вВ предыдущем абзаце разницы нет, за исключением того, что вам пришлось вводить на 1 символ меньше.

Наконец, я благодарю вас за ваш подход к самостоятельному выяснению вещей.Ваши небольшие тесты помогли вам доказать эти факты для себя и это метод, который я хотел бы, чтобы больше постеров с вопросами здесь, на SO, научились бы использовать!;-).

Вы на правильном пути к пониманию того, как улучшить свои знания оболочки.Если вы не знаете о различных инструментах отладки, доступных в оболочке, см. Третий абзац в Использование команды nohup для очень запутанной команды? , re set -vx и PS4=....

Надеюсь, это поможет.

1 голос
/ 15 сентября 2011

2) $ x увеличивается до вычисления $ (()):

x=1+
echo $(($x 1)) 
=>2
echo $((x 1)) 
=>syntax error when trying to make an operand from "1+"
...