下面的代码不起作用。
我已经对所有行进行了解释:
#!/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”按字面意思理解。