Как арифметика удара работает?

[114296]С помощью GNU [114668]awk[114669] в [114670]bash[12121]
1
13.04.2017, 15:36
2 ответа

В оболочке POSIX Арифметическое расширение имеет вид:

$((expression))

Если выражение содержит переменные, а эти переменные содержат действительное целое значение - ведущее плюс или минус хорошо - то "$((var))" и "$(($var))" вернут тот же самый результат (Примечание: использование не дезинфицированных данных в арифметической оценке Шелл приводит к последствиям для безопасности).

Форма $[выражение] не определена POSIX, устарела и будет удалена в следующей версии bash.

Утилита expr может быть использована для арифметики. В вашем случае, вы использовали неправильный синтаксис для замены команды , это обратная ссылка, а не одна кавычка:

echo `expr "$num1" + "$num2"`

Но вместо нее вы должны использовать "$()" форму.

1
27.01.2020, 23:20

Ни пока!... , ни до... работает с системами, которые заморозили среду оболочки перед POSIX.1-2001. Это, однако, делает.

while :; do
    if some command; then
        break
    fi
    sleep 1
done

Если вам не нужна полная переносимость, зачем вы пишете сценарий оболочки? Perl более вероятно будет доступен, чем Bash.

sleep 1 while 0 != system qw(some command);

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

-121--31362-

В ответе предлагается подсчитать количество открытых окон терминалов путем подсчета количества существующих псевдотерминалов. Я не считаю, что это правильный ответ: он фактически подсчитывает количество терминальных окон ПЛЮС количество удаленных входов, экранов или tmux окон, скриптов или ожидать сеансов и так далее. Чтобы действительно считать только количество окон терминала, нужно сделать что-то, чтобы исключить все остальные вещи из подсчета. Возможно, можно проверить каждую pty, чтобы проверить, является ли терминальное приложение, такое как Terminal.app для MacOS, родительским процессом любого процесса, указанного как выполняющийся на этом tty (используйте ps -ft < имя tty > ).

Независимо от этого, прямой ответ на ваш вопрос «Есть ли альтернатива/dev/pts на Mac OSX?» - да, терминальные окна на MacOS работают в псевдотисах так же, как в других операционных системах. Как видно из выходных данных tty , работающих под одним из них, имена этих ptys следуют за образцом /dev/ttys < три цифры > , и, как видно из простых быстрых экспериментов с ls , в /dev фактически существуют только те, которые в настоящее время выделены. Поэтому, да, та же хитрость проверки, какая ptys существует в /dev , работает в MacOS. (Обратите внимание, что этот трюк работает не при каждой операционной системе: при некоторых операционных системах: все возможные имена pty всегда существуют в /dev независимо от того, выделены они или нет.)

-121--175207-

Для вычисления арифметического выражения оболочка сначала расширяет переменные и командует замены внутри них. Например, в echo «$ (($ num1 + $ num2))» первое, что происходит, это то, что $ num1 и $ num2 заменяются значениями переменных. Выражение становится 2 + 5 . Это анализируется как арифметическое выражение и вычисляется до числа 7. Результатом анализа и расширения «$ (($ num1 + $ num2))» , таким образом, является 7 .

Арифметические выражения могут содержать имена переменных. Они вычисляются по значению переменной. Таким образом, $ ((num1 + num2)) является арифметическим выражением num1 + num2 (тогда как $ (($ num1 + $ num2)) является арифметическим выражением 2 + 5 ). В этом случае результат тот же.

Два выражения различаются, если значение num1 или num2 не является просто последовательностью цифр. Например, рассмотрим следующий фрагмент:

a="1+2"
echo "$(($a * 4))"
echo "$((a * 4))"

Во второй строке вычисляемое арифметическое выражение 1 + 2 * 4 . Это анализируется как 1 + (2 × 4), поскольку умножение имеет более высокий приоритет, чем сложение. Тот факт, что знак плюс пришел от расширения переменной, забывается к моменту арифметической оценки. Результатом является число 9, поэтому первый вызов echo печатает 9 .

Поведение третьей строки зависит от оболочки. Некоторые оболочки (например, тире) жалуются, что a не содержит допустимого числового значения. Другие оболочки (например, ksh, bash, zsh) рассматривают значение a как подэкспрессию, которая вычисляется для получения значения, используемого в основном выражении. То есть в этих других оболочках значение a вычисляется до 3 , а арифметическое выражение вычисляет 3 × 4 так что результат 12.

Наконец, $ [...] является устаревшим, нестандартным вариантом $ ((...)) . Утилита expr - это старый способ выполнения арифметических вычислений в сценариях оболочки, восходящий к тому времени, когда оболочки не имели встроенного арифметического синтаксиса. expr «$ num1» + «$ num2» печатает 7, как и избыточный echo 'expr «$ num1» + «$ num2»' (вы ошиблись одной из кавычек).

3
27.01.2020, 23:20

Теги

Похожие вопросы