переменная изменяется неожиданно, когда awk или sed находятся в сценарии

В следующем сценарии значение переменной LINES изменения неожиданно для оценки 24. Но когда я комментирую awk и sed команды, остальные хорошо работают.

LINES=4
SNAPNUM=0

while [ $LINES -gt 0 ]
do
OUTPUT=$(ls -1 snapshot_com.crd.* | tail -$LINES | head -1)
awk '{if ($1 ~ /^trajin/) print $0, "'$OUTPUT'"; else print $0}' temp.trajin
sed '/^trajin/ s/$/ '$OUTPUT'/' temp.trajin > combine.trajin
((SNAPNUM++))
  printf "snapshot number $SNAPNUM\n"
  printf "line number $LINES\n"
 ((LINES--))
done
0
задан 24 December 2016 в 05:59

1 ответ

Поведение, которое Вы видите, непосредственно не связано с sed или awk - это - результат по Вашему выбору LINES как название Вашей переменной цикла (и правила обзора данных для переменных оболочки).

переменные оболочки LINES и COLUMNS используются эмуляторами терминала для отслеживания размер их окна вывода, так, чтобы они могли правильно перенести текст и нумеровать страницы его (когда пейджер такой как less используется). Поведение по умолчанию bash состоит в том, чтобы проверить размер окна после каждой внешней команды:

       checkwinsize
               If set, bash checks the window size after  each  command
               and,  if necessary, updates the values of LINES and COL‐
               UMNS.

В Вашем случае, LINES становится обновленным (и сброс к терминальной высоте по умолчанию, которая является 24 строками) после каждого вызова sed и awk.

, Хотя возможно выключить checkwinsize опция (использующий shopt -u checkwinsize) это не рекомендуется: вместо этого необходимо просто изменить имя переменной на что-то, что не будет конфликтовать, такие как нижний регистр lines. Хорошее эмпирическое правило состоит в том, чтобы избежать все-прописных имен полностью: посмотрите, например , там соглашения о присвоении имен для переменных в сценариях оболочки?

1
ответ дан 7 November 2019 в 06:43

Другие вопросы по тегам:

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