Я нашел полезную информацию в вики 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 != 10in 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)}').