В следующем сценарии значение переменной 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
Поведение, которое Вы видите, непосредственно не связано с 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
. Хорошее эмпирическое правило состоит в том, чтобы избежать все-прописных имен полностью: посмотрите, например , там соглашения о присвоении имен для переменных в сценариях оболочки?