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