在下面的脚本中,变量的值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
答案1
您所看到的行为与sed
或没有直接关系 - 它是您选择作为循环变量名称awk
的结果(以及 shell 变量的作用域规则)。LINES
shell 变量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
。一个好的经验法则是完全避免使用全大写的名称:例如shell 脚本中的变量有命名约定吗?