【问题标题】:Unexpected variable update when using bash's $(( )) operator for arithmetic使用 bash 的 $(( )) 运算符进行算术运算时出现意外的变量更新
【发布时间】:2011-11-18 17:47:55
【问题描述】:

我正在尝试从文件中删除几行。我确切地知道要删除多少行(例如,从顶部开始 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

希望有人可以帮助我了解发生了什么。

【问题讨论】:

  • 我不能告诉你 LINES 发生了什么,但我可以提供一个替代解决方案:head(1)/tail(1) 允许跳过 N 首/最后一行,所以你不必自己做任何数学运算。

标签: bash shell environment-variables


【解决方案1】:

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

【讨论】:

  • 这只是你不应该使用全大写变量名的另一个原因:以避免与环境变量冲突。
【解决方案2】:

分解问题所在总是有帮助的。跑步

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

应该可以告诉你问题出在哪里。

改为使用

LINES=$(wc -l < $FILENAME )

嗯.. 是的,恐怕@MichaelHoffman 可能更准确地诊断出您的问题。

我希望这会有所帮助。

【讨论】:

    【解决方案3】:

    你也可以只做sed 'X,Yd' &lt; file

    其中 X,Y 是您要省略的行的范围(在本例中为 1,2)。

    其他选择是:

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

    sed /regex/,Yd' 省略正则表达式匹配的行和 Y 之间的所有内容

    sed '/regex/,+Yd' 从正则表达式匹配的位置开始省略 Y 行

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

    注意:这些是 GNU sed 扩展

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 2022-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 2011-02-21
      相关资源
      最近更新 更多