UNIXシェルスクリプトで2つの文字列を比較するには? [コピー]

UNIXシェルスクリプトで2つの文字列を比較するには? [コピー]

sedコマンドの出力である文字列を格納する変数があります。その文字列値が他の2つの文字列のうちの1つと一致する場合にのみ、一連のコマンドを実行したいと思います。

以下のコードを使用しました。

#! /bin/ksh
request=”Request”
fault=”Fault”
while read lines; do
    category=`echo $lines|sed -n -e 's/.*Summary: Value//p'| awk '{print $1}'`
    if [ ! -z "$category" ]
    then
        if($category = $request)
        then
            echo $category
        fi
     fi
done<content.txt

しかし、これによりエラーが発生しました。

sample.sh: Request: not found

Request変数カテゴリには値または値があります。Order

誰かがエラーや解決策を指摘できますか?

if 内の if が削除され、echo $category正しい文字列値が印刷されます。

答え1

簡単な答えは、次の構文を使用できることです。

if [ "$category" = "$request" ]

間隔が重要です。参考までに、コマンドの置き換えと置換のために最も近い方法を使用する必要があります(参照第1条そしてPOSIXの記事):

category=`echo $lines|sed -n -e 's/.*Summary: value//p'| awk '{print $1}'`

だから

category=$(echo $lines|sed -n -e 's/.*Summary: value//p'| awk '{print $1}')

答え2

if他の人はあなたの声明の文法的エラーを指摘しました。

また、一般的な二重引用符の代わりに二重引用符印刷を使用しているように見えることにも言及したいと思います"。また、sedこのコマンド置換の出力を別の変数に保存する必要はありません。代わりawkに出力から直接読んでください。

#!/bin/ksh

sed -n 's/.*Summary: Value//p' <content.txt | awk '{ print $1 }' |
while IFS= read -r category; do
    case $category in
        Request|Fault)
            printf '%s\n' "$category"
            ;;
        Breakfast)
            echo 'Yum'
            ;;
        *)
            printf 'Unknown category: %s\n' "$category"
    esac
done

または - ドアを使用する方が楽なif場合

#!/bin/ksh

sed -n 's/.*Summary: Value//p' <content.txt | awk '{ print $1 }' |
while IFS= read -r category; do
    if   [ "$category" = 'Request' ] || [ "$category" = 'Fault' ]; then
        printf '%s\n' "$category"
    elif [ "$category" = 'Breakfast' ]; then
        echo 'Yum'
    else
        printf 'Unknown category: %s\n' "$category"
    fi
done

文字列が空であるかどうかをテストする必要はありません。空の文字列を他の文字列と比較する限り、問題はありません。常に変数拡張を引用してください。

または、スクリプトが次の操作のみを実行する場合:

#!/bin/ksh

sed -n 's/.*Summary: Value//p' <content.txt | awk '
    $1 == "Request" || $1 == "Fault" { print $1;    next }
    $1 == "Breakfast"                { print "Yum"; next }
                                     { printf("Unknown category: %s\n", $1) }

関連:

答え3

[代わりにif条件を使用する必要があります。(

努力する:

 if [ "$category" = "$request" ]
  • ()コマンドを実行して終了コードを確認するために使用されます。
  • []式を確認するために使用されます。

UNIX文字ではなくMS-wordからスクリプトをコピーしたいと思います。

request=”Request”
fault=”Fault”

これを編集して

request="Request"
fault="Fault"

答え4

他のすべての答えで話すことに加えて、

  1. awk非常に強力なプログラムです。これを他のテキスト書式設定コマンドと組み合わせる必要はほとんどありません。例えば、
    sed -n -e 's/.* 要約: 値 //p' awk '{print $1}'
    に変換することができる
    awk '{ if (sub(/.*Summary: Value/, "")) $1 印刷 }'
  2. 特別な理由がない限り、常にシェル変数(たとえば、、"$lines"および"$category")を引用する必要があります。"$request"確かにあなたは何をしているのか知っています。
  3. 〜のようにコサロナンダは指摘した。シェルループを使用してテキストを処理することは悪い習慣と見なされます。。上記のように、awkこれは非常に強力なプログラムです。スクリプトがファイルを一度に 1 行ずつ読み込み、各行awkに 1 回ずつ呼び出すことを理解しているとします。明示的に言及することなく、Kusalalanandaはファイル全体を一度sed実行(および)するためのサンプルソリューションを提供します。最後の解決策は、すべてのロジックをシェルコードではなくスクリプトに入れます。あなたの質問が示すように、現在やっている作業が文字列を印刷するだけであれば、これはおそらく最善のアプローチです。ただし、入力に基づいて他のコマンドを実行する必要がある場合にも使用できます。タスクの複雑さは、どの方法がより良いかを決定する要因です。awksedawksystem()awk

関連情報