下面的代码不起作用。
我已经对所有行给出了解释:
#!/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)
不是 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 不会在内部进行分词或路径名生成[[...]]
。这允许为字符串匹配目的指定模式。