Сценарий Bash -Как 6 > 50?

Всегда можно сделать:

grep -o... | awk '{print};END{if (NR) print "\n" NR " matched."}'

Или сделать все это в awk(, что также позволит избежать -oи \+GNUизмов):

awk 'match($0, /^[[:alpha:]_]+[[:blank:]]*\([[:blank:]]*\)/) {
       print substr($0, RSTART, RLENGTH)
       n++
     }
     END{if (n) print "\n" n " matched.")'

илиperl:

perl -lne 'for (/^\w+\h*\(\h*\)/g) {print; $n++}
           END {print "\n$n matched." if $n}'

(обратите внимание, что в этом случае \wограничен буквами ASCII, добавьте -Mopen=locale, чтобы включить любую букву в любом алфавитном письме в соответствии с локалью, как в grepилиawk(некоторыеawk)подходы)

Что касается вашего вопроса 2, это потому, что bash(, в отличие от zsh), не ожидает команд, запущенных в процессе подстановки, вызывая такого рода проблемы. См. Вывод замены процесса не соответствует порядку для получения более подробной информации.

-3
09.09.2020, 04:39
3 ответа

Вы предоставили [[ args ]], которое являетсяусловным выражением , когда вы хотели выполнитьарифметическое вычисление , использующее синтаксис (( condition )).

2
18.03.2021, 23:05

Если вам нужно сравнить числа с плавающей запятой, проще всего обратиться к внешнему инструменту, такому как awk или bc

a=6.1
b=50
if [[ "$(echo "$a > $b" | bc)" -eq 1 ]]; then echo "a greater than b"; fi
3
18.03.2021, 23:05

Если вы сравниваете целые числа, используйте

if [[ 6 -gt 50 ]]; then echo "true"; fi

в противном случае, поскольку bash не может обрабатывать числа с плавающей запятой

if (( $(echo "6.5 > 50" | bc -l) )); then echo "true"; fi

3
18.03.2021, 23:05

Теги

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