Я нашел полезную информацию в вики Shellcheck.net , цитирую:
Bash:
for ((init; test; next)); do foo; done
POSIX:
: "$((init))"
while [ "$((test))" -ne 0 ]; do foo; : "$((next))"; done
хотя будьте осторожны, i++
это не POSIX, поэтому придется переводить, например, в i += 1
или i = i + 1
.
Таким образом, приведенный выше сценарий в вопросе может быть переписан с использованием POSIX с использованием следующих правил:
#!/bin/sh
: "$((i=1))"
while [ "$((i != 0))" -ne 0 ]
do
echo "$i"
: "$((i = i + 1))"
done
Хотя здесь вы можете сделать его более разборчивым с помощью:
#!/bin/sh
i=1
while [ "$i" -ne 10 ]
do
echo "$i"
i=$((i + 1))
done
Например init
, мы присваиваем постоянное значение, поэтому нам не нужно вычислять арифметическое выражение. Значение i != 10
in test
может быть легко преобразовано в [
выражение, а next
использование присваивания переменной оболочки в отличие от присваивания переменной внутри арифметического выражения позволяет избавиться от :
необходимости заключать в кавычки.
Помимо i++
-> i = i + 1
, есть больше переводов конструкций, специфичных для ksh / bash, которые не являются POSIX, которые вам, возможно, придется сделать:
i=1, j=2
, Арифметический оператор не очень POSIX (и конфликты с десятичным разделителем в некоторых местах с ksh93). Вы могли бы заменить его другим оператором, как в, но использование было бы намного более разборчивым.,
+
: "$(((i=1) + (j=2)))"
i=1 j=2
a[0]=1
: нет массивов в оболочках POSIX
i = 2**20
: нет оператора питания в синтаксисе оболочки POSIX. <<
хотя поддерживается для степеней два, можно использовать i = 1 << 20
. Для других полномочий можно прибегнуть к bc
:i=$(echo "3 ^ 20" | bc)
i = RANDOM % 3
: не POSIX. Наиболее близким в инструментальной панели POSIX является i=$(awk 'BEGIN{srand(); print int(rand() * 3)}')
.