bash и использование переменной, чтобы решить, когда использовать 'set'?

Кратчайшийawkподход:

awk -F'[|/]' '{print >(($5<=15)?"1-15":"16-31")"Aug"}' file
  • -F'[|/]'-разделитель сложных полей

Просмотр результатов:

for f in [0-9]*Aug; do echo "file: $f"; cat "$f"; echo; done

Выход:

file: 1-15Aug
a|b|c|08/01/2017|d
a|b|c|08/15/2017|d

file: 16-31Aug
a|b|c|08/16/2017|d
a|b|c|08/31/2017|d
0
31.12.2018, 12:22
2 ответа

Вы должны сбросить xtrace в функции.

dtest(){
  [ "${d:=0}" -gt 0 ] && set -x
  var="abc"
  echo "${var}"
  set +x
}
d=0;dtest
d=1;dtest
d=0;dtest

Или используйте подоболочку:

dtest(){
  [ "${d:=0}" -gt 0 ] && set -x || set +x
  var="abc"
  echo "${var}"
}
d=0;(dtest)
d=1;(dtest)
d=0;(dtest)
0
28.01.2020, 04:13

Меня это устраивает.

set -xотключен изначально, а с d=0не устанавливается:

$ dtest(){ [ "${d:=0}" -gt 0 ] && set -x || set +x; var="abc"; echo "${var}"; }
$ d=0;dtest
abc

Здесь он установлен в середине функции, последние две команды печатаются в трассировке:

$ d=1;dtest
+ var=abc
+ echo abc
abc

Здесь set -xдействует с момента последнего запуска функции и отключается в середине функции. Трассировка не печатается для двух последних команд после запуска set +x.

$ d=0;dtest
+ d=0
+ dtest
+ '[' 0 -gt 0 ']'
+ set +x
abc

Если вы хотите безоговорочно отключить трассировку в конце функции, вы должны нужно добавить вызов set +x.

В качестве альтернативы, чтобы изменение вступило в силу только внутри функции, вы можете использоватьlocal -(в текущих версиях Bash )в начале функции или сохранить значение $-вручную перед внесением изменений и установить /reset трассировка на основе сохраненного значения в конце. Запуск функции в подоболочке имел бы аналогичный эффект, но в этом случае любые изменения переменных в функции также не были бы видны вне ее.

0
28.01.2020, 04:13

Теги

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