命令在命令行和脚本文件中产生不同的结果

Command produces different results in commandline versus script file

我有这条线

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

产生此输出:

27

我想在编辑文件的脚本中使用它。所以我在 myscript.ksh:

中做了这个
fileName=
....
lastLine=`grep -n -m7 '$' ${fileName}.asm | tail -n 1 | awk -F':' '{print }'`
....
echo ${lastLine}

当我这样做时,lastLine27 的期望值仅为 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: not found [No such file or directory]

所以这与那个操作员有关,但我以前从未遇到过这个问题。我该如何解决?

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

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

错误来自 $ 被读取为 $。但是我该如何解决呢?

我认为你把事情复杂化了。

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

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

我没有安装 ksh,但这在 csh 下有效。

解释:

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

停止使用 `backticks`。使用 $(..) 代替:

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

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

$ echo '$'
$

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

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

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

现代命令替换,$(..),没有这些问题,并允许您包装未修改的命令。 $(..) 是 POSIX,因此没有理由使用反引号。