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 [[ $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.は[[...]]シェル構文の一部として扱われ、 [...]他のコマンドのように扱われます。演算子とオペランドは、拡張が実行された後ではなくコマンドを読み取ると検出されます。シェルは内部的にパス名をトークン化または生成しません [[...]]。これにより、文字列一致の目的でパターンを指定できます。

おすすめ記事