ksh 脚本中出现意外的条件结果

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

到目前为止,代码运行良好。

如果 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

答案1

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

第一个问题:你必须使用单引号M$9001,否则 shell 将尝试扩展$9001.

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

你还应该引用$H_OR_T,以防它扩展成有趣的东西。

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

if [[ "$H_OR_T" = 'M$9001' || "$H_OR_T" = 'M$9002' ]];

或者符合 POSIX 且更便携:

if [ "$H_OR_T" = 'M$9001' ] || [ "$H_OR_T" = 'M$9002' ];

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

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

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

答案2

如果您要与精确值进行比较,请使用单引号表示 M$9001。

if [[ "$H_OR_T" = 'M$9001' ]]; then
  ...
fi

答案3

这个脚本还有更多问题。无用的使用cat就是例子之一。如果我们采用脚本的第一部分,我们可以将其写为

while read -r line; do echo "$line"; done < example.txt

参加了有if.. else什么用awk {print $0}'

if [[ "$H_OR_T" == 'M$9001' ]]; then
 ....
 ....
fi

在这种情况下,“M$9001”按字面意思理解。

相关内容