命令在命令行和脚本文件中产生不同的结果
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}
当我这样做时,lastLine
中 27
的期望值仅为 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,因此没有理由使用反引号。
我有这条线
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}
当我这样做时,lastLine
中 27
的期望值仅为 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,因此没有理由使用反引号。