Арифметический синтаксис в bash

Вот решение awk :

awk 'NR==FNR{z[$0"-ADM"]++;next}
{p=$3;sub(/.*-P/, "", p); if ($2 in z && p > 2)
{print $1,$3 > "stoplist.lst"; $0="#"$0}}1' sites.lst master.tbl

Сначала он читает sites.lst и устанавливает $ 0 "-ADM" (это имя сайта + string -ADM ) как индекс массива z . Затем он обрабатывает master.tbl , извлекая значение после -P в 3-м поле как p и, если условия соблюдены (2-е поле находится в ] z и p больше 2) он печатает 1-е и 3-е поля в stoplist.lst и комментирует строку.
Обратите внимание, что он не редактирует файл на месте, но вы всегда можете перенаправить на другой файл и перезаписать оригинал, если все в порядке (хотя с недавним gnu awk вы есть опция -i на месте ).

3
17.02.2017, 01:29
2 ответа

Арифметическое расширение выполняется bash и некоторыми другими оболочками с помощью $ ((...)) , например

line_count=$(( line_count/3 ))

С помощью line_count = $ (line_count) / 3 вы назначаете вывод команды line_count переменной line_count с суффиксом / 3 .

Вот почему вы получаете ошибку «line_count: command not found», а затем вывод / 3 .

Взгляните на ShellCheck на https://www.shellcheck.net/ Он может проверить ваш скрипт на наличие распространенных проблем. В этом случае это не поможет вам определить, что $ (...) должно было быть $ ((...)) , но это потому, что $ ( line_count) - вполне допустимый шелл-код. Он просто делает неправильные вещи.

7
27.01.2020, 21:08

В дополнение к ответу @ Кусалананды в дополнение к стандартному синтаксису sh :

line_count=$((line_count / 3))

В bash вы также можете использовать эти синтаксисы, унаследованные от ] ksh (также работает в zsh ):

  •  ((line_count = line_count / 3)) 
  •  ((line_count / = 3)) 
  •  let line_count / = 3 
  •  typeset -i line_count; line_count = line_count / 3 

bash zsh ) также поддерживает:

  •  line_count = $ [line_count / 3] 

Для старых версий Bourne / Almquist до POSIX sh :

line_count=`expr "$line_count" / 3`
11
27.01.2020, 21:08

Теги

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