以下のコードは機能しません。
私はすべての行を説明しました。
#!/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 [[ $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の専門家ではありませんが、コードには2つの問題があると思います。
最初の問題:一重引用符を使用する必要がありますM$9001
。それ以外の場合、シェルは拡張を試みます$9001
。
[ ]
2番目の問題:内部に入れ子になっていません[ ]
。[[ ]]
一方または両方を使用してください[ ]
。
$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.は
[[...]]
シェル構文の一部として扱われ、[...]
他のコマンドのように扱われます。演算子とオペランドは、拡張が実行された後ではなくコマンドを読み取ると検出されます。シェルは内部的にパス名をトークン化または生成しません[[...]]
。これにより、文字列一致の目的でパターンを指定できます。
答え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」は文字通り使用されます。