私の KornShell (ksh) スクリプトは、コマンド ライン引数を入力として受け取ります。私の仕事は、それらの引数にabcが含まれているかどうかを確認し、 abcを含む引数のみを出力することです。例えば:-
./tree.sh rabc try qwerty
出力は :: である必要があります
rabc
これは私が試したことです:
var=$*
z=grep "abc" var
echo $z
これに関する洞察はありますか?
まず、引数をループできる必要があります。をman ksh
調べると、次のことがわかります。
for vname [ in word ... ] ;do list ;done
for
コマンドが実行されるたびに、リストから取得されvname
た次のコマンドが設定されます。が省略された場合、コマンドは、1 から始まる設定された各位置パラメーターに対して を 1 回実行します (以下のパラメーター展開を参照)。リストに単語がなくなると、実行が終了します。word
in word
in word ...
for
do list
ループを取得するには、次のようなものが必要です。
for arg
do
<stuff>
done
<stuff>
実行中の時点で、渡されるパラメーターの 1 つになります。先頭$arg
の部分が必要であることに注意してください。$
ksh では、変数名をそのまま使用するのではなく、変数に格納されている値を使用することを知る必要があります。
次に、 が$arg
含まれているかどうかを調べる必要がありますabc
。を使用しますが、与えられたファイル、または標準入力 (「stdin」) で渡されたものすべてを検索することをgrep
覚えておいてください。grep
あなたが与えた は、 というファイルで検索しようとするgrep "abc" var
でしょう。grep
abc
var
の標準入力に$arg
入る必要があります。標準出力 ("stdout") に出力する と、あるコマンドの stdin を別のコマンドの stdout に結合する "pipe" をgrep
使用します。echo
echo "$arg" | grep abc
上記は、入っているものをすべて$arg
stdinに入れ、grep
含まれている場合にのみ出力しますabc
。
したがって、完全なスクリプトは次のようになります。
#!/bin/ksh
for arg
do
echo "$arg" | grep abc
done
これは、引数に改行が含まれる場合を適切に処理しません。それは今後の課題として残しておきます。