Если, как вы сказали, вам нужен только выходной объем, вам не нужен awk
. Если вам не нужна математическая точность, когда дело доходит до округления нецелого десятичного числа до целого числа, вы можете использовать это:
osascript <<< "(output volume of (get volume settings) * 0.64) as integer"
Примечательно, что это занимает от 0,5 до 0 и от 2,5 до 2, но большинство другие половины ведут себя нормально (это связано с внутренними ошибками с плавающей запятой).
Если вы сохраните точность sh, то вы можете использовать это:
osascript <<< "round ((output volume of (get volume settings)) * 0.64) rounding as taught in school"
Это округлит вверх или вниз так, как можно (или нужно) на экзамене по математике.
Обведите все это vol=$( ... )
для назначения переменной, заменив три точки одним из двух приведенных выше выражений.
Приглушено / Не приглушено
Использование второго из двух приведенных выше примеров для демонстрации способа присвоения значения 0
переменной bash
vol
, если звук отключен, имеет вид это:
vol=$(( $(osascript <<< "tell (get volume settings) to ¬
if not output muted then tell (output volume * 0.64) ¬
to continue round it rounding as taught in school") ))
Я разбил AppleScript на несколько строк для удобства чтения, которые вы можете оставить как есть, или удалите символы продолжения (¬
) и поместите его в одну строку, если это что вам нужно.
T он использует bash
арифметическую расшифровку c, $(( ... ))
, внутри которой находится вызов osascript
, который теперь условно возвращает значение output volume
, если и только если системный том не отключен.
Если системный том отключен , сценарий ничего не возвращает, то есть пустое выражение - которое, bash
арифметическое c выражение просто так оценивается как 0
.
Просто, если вы заинтересованы ...
Есть несколько других способов использовать bash
арифметических c выражений для достижения аналогичного эффекта:
Вы можете переместить все назначение внутри арифметического c расширения:
(( vol=$(osascript <<< "tell (get volume settings) to ¬
if not output muted then tell (output volume * 0.64) ¬
to continue round it rounding as taught in school")+0 ))
В этой ситуации мы должны добавить 0
к выражению: это потому, что один из возможных результатов AppleScript - ничего не возвращать, что привело бы к бессмысленному математическому выражению, а именно (( vol= ))
. Тем не менее, (( vol=+0 ))
абсолютно нормально и не меняет значение результата, когда AppleScript возвращает число.
Эта синтаксическая форма может быть полезна, потому что будет отключен системный том или нет. отражается в состоянии возврата этой строки кода bash
, т. е. если системный том отключен, состояние возврата отличное от нуля.
Другой способ оценки арифметики c выражения bash
должны использовать let
. Поскольку присвоение переменной происходит как часть самого выражения арифметического c, также потребуется добавить 0
, чтобы обеспечить полный и действительный расчет во всех сценариях ios:
let vol=$(osascript <<< "tell (get volume settings) to ¬
if not output muted then tell (output volume * 0.64) ¬
to continue round it rounding as taught in school")+0
И, опять же, состояние возврата будет ненулевым, если громкость системы отключена (обратите внимание, что это не означает, что значение vol
будет отличным от нуля; фактически оно обязательно будет нулевым).
Если статус возврата не тот, который вы будете использовать, то все эти три формы практически одинаковы, и ни одна из них не дает каких-либо определенных c преимуществ или недостатков по сравнению с два других (если только один из них не находит конкретный синтаксис более зрительным).
Я специально не использовал bc
для оценки этих арифметических c выражений. bc
- это основная математическая программа, наиболее часто используемая в bash
, особенно при выполнении арифметических операций с плавающей запятой c. Тем не менее, главная тема моего решения заключается в том, чтобы сделать решение как можно более простым и не полагаться на цепочку конвейеров во внешние программы в ситуациях, когда это не нужно, а также менее эффективно, чем использовать преимущества, которые способен bash
делать изначально.