1

私の KornShell (ksh) スクリプトは、コマンド ライン引数を入力として受け取ります。私の仕事は、それらの引数にabcが含まれているかどうかを確認し、 abcを含む引数のみを出力することです。例えば:-

./tree.sh rabc try qwerty

出力は :: である必要があります

rabc

これは私が試したことです:

var=$*
z=grep "abc" var
echo $z

これに関する洞察はありますか?

4

1 に答える 1

1

まず、引数をループできる必要があります。をman ksh調べると、次のことがわかります。

for vname [ in word ... ] ;do list ;done

forコマンドが実行されるたびに、リストから取得されvnameた次のコマンドが設定されます。が省略された場合、コマンドは、1 から始まる設定された各位置パラメーターに対して を 1 回実行します (以下のパラメーター展開を参照)。リストに単語がなくなると、実行が終了します。wordin wordin word ...fordo list

ループを取得するには、次のようなものが必要です。

for arg
do
    <stuff>
done

<stuff>実行中の時点で、渡されるパラメーターの 1 つになります。先頭$argの部分が必要であることに注意してください。$ksh では、変数名をそのまま使用するのではなく、変数に格納されている値を使用することを知る必要があります。

次に、 が$arg含まれているかどうかを調べる必要がありますabc。を使用しますが、与えられたファイル、または標準入力 (「stdin」) で渡されたものすべてを検索することをgrep覚えておいてください。grepあなたが与えた は、 というファイルで検索しようとするgrep "abc" varでしょう。grepabcvar

の標準入力に$arg入る必要があります。標準出力 ("stdout") に出力する と、あるコマンドの stdin を別のコマンドの stdout に結合する "pipe" をgrep使用します。echo

echo "$arg" | grep abc

上記は、入っているものをすべて$argstdinに入れ、grep含まれている場合にのみ出力しますabc

したがって、完全なスクリプトは次のようになります。

#!/bin/ksh
for arg
do
    echo "$arg" | grep abc
done

これは、引数に改行が含まれる場合を適切に処理しません。それは今後の課題として残しておきます。

于 2013-01-16T13:22:46.753 に答える