!#/bin/bash
i=1
echo $((i++))
i=1
echo $((++i))
i=1
echo $((i=i+1))
Это вывод
bash increment
1
2
2
Я думал, что выражение i = i + 1 было идентично i ++.
Есть ли способ проверить, равны ли два выражения друг другу?
Хорошо, помните, что выполнение a ++ i (Pre-Increment) - это не то же самое, что i ++ (Post-Increment).
Предварительные приращения увеличивают значение перед выводом на терминал. Post-Increments сделает это после отправки в терминал. Таким образом, вы увидите, что первое значение совпадает с присвоенным в начале для первого случая.
Чтобы проверить это, просто сделайте это дважды:
i=1
$((i++)) // The output will be 1,2
А затем проверьте также и остальные дважды:
i=1
$((++i)) // The output will be 2,3
Для echo $((i=i+1))
он будет вести себя так же, как Pre Инкремент в том смысле, что (как показано в уравнении) он присвоит +1 значению 1, а затем выведет результат.
Просто чтобы проверить результаты, я сделал небольшой сценарий для игры:
x=1
xx=$((x++))
y=1
yy=$((y=y+1))
z=1
zz=$((++z))
echo $xx "Post-Increment"
echo $yy "Y+1 Sum / Same as Pre-Increment"
echo $zz "Pre-Increment"
if [ $xx -eq $yy ]; then
echo "Post-Increment X equals normal Y+1 method.. yeah right.."
elif [ $xx -eq $zz ]; then
echo "Post-Increment X equals Pre-Increment Z.. yeah sure..no problem"
elif [ $yy -eq $zz ]; then
echo "Normal Y+1 method equals Pre-Increment Z.. BINGO! You get a cookie"
fi
Традиционно, i ++ был оператором постинкремента, что означало, что новое увеличенное значение не будет доступно до следующей ссылки на него. Принимая во внимание, что оператор предварительного увеличения ++ я сделал бы увеличенное значение доступным немедленно. Использование i = i + 1 не использует эту логику, потому что поведение специфично для инкрементальных операторов.