当脚本中有 awk 或 sed 时,变量意外改变

当脚本中有 awk 或 sed 时,变量意外改变

在下面的脚本中,变量的值LINES意外变为值 24。但是当我注释掉awksed命令时,其余部分就可以正常工作。

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

答案1

您所看到的行为与sed或没有直接关系 - 它是您选择作为循环变量名称awk的结果(以及 shell 变量的作用域规则)。LINES

shell 变量LINESCOLUMNS被终端仿真器用来跟踪其输出窗口的大小,以便它们能够正确地换行和分页(当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 行)。sedawk

虽然可以关闭该checkwinsize选项(使用shopt -u checkwinsize),但不建议这样做:你应该将变量名改为不会冲突的名称,例如小写lines。一个好的经验法则是完全避免使用全大写的名称:例如shell 脚本中的变量有命名约定吗?

相关内容