ksh 脚本中的意外条件结果

gir*_*iri 3 shell ksh

下面的代码不起作用。

我已经对所有行给出了解释:

#!/bin/ksh
cat example.txt | while read LINE                 # reading line from file
do
    var=$LINE                                     # assigning line to variable
    echo $var                                     # printing the line
    H_OR_T="${var:0:6}"                           # taking substring from the line 
    echo $H_OR_T                                  # printing the substring
Run Code Online (Sandbox Code Playgroud)

到这里代码工作正常。

如果 H_OR_T 变量持有硬编码值(即 M$9001,请查看下面的 if 条件)我应该进入循环。但在这里我遇到了算术错误。

    if [[ $H_OR_T = "M$9001" ] || [ $H_OR_T = "M$9002" ]]; 
       then
       echo "************** MOVING HEADER OR TRAILER RECORD TO DOMESTIC FILE ************"
       awk '{print $0}' example.txt > domestic.txt
    else
       echo "**************** MOVING RECORD TO LOGGER FILE **********************"
       awk '{print $0}' example.txt > logger.txt
    fi
done
Run Code Online (Sandbox Code Playgroud)

les*_*ana 5

不是 ksh 专家,但我认为您的代码中有两个问题。

第一个问题:你必须单引号,M$9001否则外壳会尝试扩展$9001.

第二个问题:你没有嵌套[ ]在里面[ ]。使用[[ ]]或两个[ ].

您还应该引用$H_OR_T以防它扩展为有趣的事情。

这是您的代码可能已修复:

if [[ "$H_OR_T" = 'M$9001' || "$H_OR_T" = 'M$9002' ]];
Run Code Online (Sandbox Code Playgroud)

或者要符合 POSIX 且更便携:

if [ "$H_OR_T" = 'M$9001' ] || [ "$H_OR_T" = 'M$9002' ];
Run Code Online (Sandbox Code Playgroud)

请注意,[ ]和之间存在细微差别[[ ]]。ksh 文档在这个主题上有点稀疏。这是我找到的最好的:http : //www.kornshell.com/doc/faq.html问题编号 10。

Q10。[...]和 和有[[...]]什么区别?

A10. 将[[...]]作为 shell 语法的一部分进行处理,而 [...]像任何其他命令一样进行处理。在读取命令时检测运算符和操作数,而不是在执行扩展之后。shell 不会在内部进行分词或路径名生成 [[...]]。这允许为字符串匹配目的指定模式。

  • 我认为首选形式是`if [...] || [...]`。根据 [Greg 的 wiki](http://mywiki.wooledge.org/BashPitfalls#A.5B_.22.24foo.22_.3D_bar_.26.26_.22.24bar.22_.3D_foo_.5D),此表单符合 POSIX。 (3认同)