使用bash的$(())运算符进行算术运算时出现意外的变量更新

时间:2011-11-18 17:47:56

标签: bash shell environment-variables

我正在尝试修剪文件中的几行。我确切地知道要移除多少行(比如从顶部开始的2行),但不知道文件中有多少行。所以我尝试了这个直截了当的解决方案:

$ wc -l $FILENAME
119559 my_filename.txt
$ LINES=$(wc -l $FILENAME | awk '{print $1}')
$ tail -n $(($LINES - 2)) $FILENAME > $OUTPUT_FILE

输出很好,但LINES发生了什么?

$ wc -l $OUTPUT_FILE
119557 my_output_file.txt
$ echo $LINES
107

希望有人能帮助我了解正在发生的事情。

3 个答案:

答案 0 :(得分:5)

$LINES具有特殊含义。它是终端具有的行数,如果您调整终端窗口的大小,它将被重置。请参阅info "(bash)Bash Variables"

答案 1 :(得分:0)

分解您遇到问题的位置总是有帮助的。运行

 wc -l $FILENAME | awk '{print $1}'

应该可以告诉你问题所在。

相反,请使用

LINES=$(wc -l < $FILENAME )
嗯..是的,我害怕@MichaelHoffman可能更准确地诊断出你的问题。

我希望这会有所帮助。

答案 2 :(得分:0)

你也可以sed 'X,Yd' < file

其中X,Y是您要省略的行的范围(在这种情况下,它将是1,2)。

其他替代方案是:

sed 'X,+Yd'省略了从第X行开始的Y行

sed /regex/,Yd'省略正则表达式匹配的行与Y

之间的所有内容

sed '/regex/,+Yd'省略了从正则表达式匹配

开始的Y行

sed '/regex/,/regex/d'省略了两个正则表达式之间的所有内容

注意:这些是GNU sed扩展