Я знаю, как создать арифметический for
цикл в bash
.
Как сделать эквивалентный цикл в сценарии оболочки POSIX?
Поскольку существуют разные способы достижения одной и той же цели, не стесняйтесь добавлять свой собственный ответ и немного рассказать о том, как он работает.
Ниже приведен пример одного такого bash
цикла:
#!/bin/bash
for (( i=1; i != 10; i++ ))
do
echo "$i"
done
shell-script
posix
bourne-shell
LinuxSecurityFreak
источник
источник
Ответы:
Я нашел полезную информацию в вики Shellcheck.net , цитирую:
Bash:
POSIX:
хотя будьте осторожны,
i++
это не POSIX, поэтому придется переводить, например, вi += 1
илиi = i + 1
.Таким образом, приведенный выше сценарий в вопросе может быть переписан с использованием POSIX с использованием следующих правил:
Хотя здесь вы можете сделать его более разборчивым с помощью:
Например
init
, мы присваиваем постоянное значение, поэтому нам не нужно вычислять арифметическое выражение. Значениеi != 10
intest
может быть легко преобразовано в[
выражение, а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
: нет массивов в оболочках POSIXi = 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)}')
.источник
спасибо за глубокие знания о разнице. Падение замены, которое работает для меня при использовании shellcheck.net, было таким, как показано ниже.
BASH
POSIX
некоторые люди отметили, что seq также является опцией, использующей seq 1 10. Создание цикла, однако это зависит от того, что у os есть seq.
источник