Command在命令行与脚本文件中生成不同的结果

时间:2016-09-19 16:46:00

标签: linux ksh

我有这条线

grep -n -m7 '\$' myfile.asm | tail -n 1 | awk -F':' '{print $1}'

产生此输出:

27

我想在编辑文件的脚本中使用它。所以我在myscript.ksh中执行了此操作:

fileName=$1
....
lastLine=`grep -n -m7 '\$' ${fileName}.asm | tail -n 1 | awk -F':' '{print $1}'`
....
echo ${lastLine}

执行此操作时,27lastLine的预期值仅为7。这是我正在使用的文件的前30行。

$***********************************************************************
$ THE FOLLOWING BULK DATA ENTRIES RELATED TO EXT. SUPERELEMENT     5000
$ ARE FOR USE IN THE MAIN BULK DATA PORTION OF THE ASSEMBLY RUN
$***********************************************************************
$
SEBULK      5000EXTOP2            MANUAL                      12
$
SECONCT     5000       0              NO
           60582   60582  180021  180021  180023  180023  180057  180057
          180941  180941  180942  180942  180943  180943  180944  180944
          180946  180946  180947  180947  204499  204499  231050  231050
          231060  231060  232050  232050  232060  232060  252300  252300
          252301  252301  253072  253072  253073  253073  401101  401101
          401102  401102  401103  401103  401104  401104  402101  402101
          402102  402102  402103  402103  402104  402104  403101  403101
          403102  403102  403103  403103  403104  403104  404101  404101
          404102  404102  404103  404103  404104  404104  405101  405101
          405102  405102  405103  405103  405104  405104  406101  406101
          406102  406102  406103  406103  406104  406104  407101  407101
          407102  407102  407103  407103  407104  407104  408101  408101
          408102  408102  408103  408103  408104  408104  631050  631050
          631060  631060  632050  632050  632060  632060  652300  652300
          652301  652301  653072  653072  653073  653073  662050  662050
          662060  662060  677500  677500  677600  677600  678516  678516
          678622  678622  679514  679514  679620  679620  703077  703077
          703078  703078 1184100 1184100 1184200 1184200 1184400 1184400
$
CORD2C*           220102          220104 0.000000000E+00 0.000000000E+00
*        0.000000000E+00 0.000000000E+00 0.000000000E+00 0.100000000E+01
*        0.100000000E+01 0.900000000E+02 0.100000000E+01

我要做的是在此阶段将此文件中的SECONCT条目复制到另一个文件中。我知道它以SECONCT开头,以第7 $结尾。就像我说它在命令行工作但在脚本中没有。如果我使用"`"在命令行运算符我收到此错误:

  

-ksh:7:找不到[没有这样的文件或目录]

所以这与那个运营商有关,但我之前从未遇到过这个问题。我该如何解决?

更新: 我用set -x运行它,这是输出:

+ grep -n -m7 '$' sq93a3mkop2_4hz.asm
+ awk -F: '{print $1}'
+ tail -n 1
+ lastLine=7

错误来自\$正在读作$。但是我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我认为你过度复杂了。

这是输出该部分的一种更简单的方法:

 sed -n '/SECONCT/,/^\$$/p' myfile.asm

我没有安装ksh,但这可以在csh下运行。

说明:

  • " -n" - sed只会打印您感兴趣的内容。
  • " / SECONCT /" - 当SECONCT线出现时开始。
  • " / ^ \ $$ /" - 只需" $"下一行时停止出现。
  • " P" - 打印两种图案之间的所有内容,包括在内。

答案 1 :(得分:1)

停止使用$(..)。请改用lastLine=$(grep -n -m7 '\$' ${fileName}.asm | tail -n 1 | awk -F':' '{print $1}')

$ echo '\$'
\$

$ echo "`echo '\$'`"    # Working command produces different results in backticks
$

$ echo "`echo '\\$'`"   # ... and requires another layer of escaping.
\$

$ echo "$(echo '\$')"   # $() just works.
\$

Backticks是具有几个怪癖的遗留语法,其中一个是对某些字符强加一个新的特殊转义层:

$(..)

现代命令替换$(..)没有这些问题,并允许您包装未修改的命令。 <button class="btn btn-default" data-toggle="modal" data-target="#theModalID"">open modal</button> <div class="modal fade" id="theModalID" role="dialog"> <div class="tab-content"> <div id="tab1" class="tab-pane fade in active"> <!-- tab 1 --> </div> <div id="tab2" class="tab-pane fade"> <!-- tab 2 --> <button type="button" class="btn btn-default" data-toggle="tab" href="#tab3">tab3</button> </div> <div id="tab3" class="tab-pane fade"> <!-- tab 3 --> <button type="button" class="btn btn-default" data-toggle="tab" href="#tab1">tab1</button> </div> </div> </div> 是POSIX,因此没有理由使用反引号。