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设置为wordin word列表中获取的下一个命令。如果in word ...省略,则该命令对从 1 开始设置的每个位置参数for执行一次(请参阅下面的参数扩展)。do list当列表中没有更多单词时,执行结束。

所以要获得循环,我们需要这样的东西:

for arg
do
    <stuff>
done

在我们运行<stuff>时,$arg将是传入的参数之一。注意您需要$前面的部分;ksh 要求它知道使用存储在变量中的值,而不仅仅是按原样使用变量名。

接下来,我们需要确定是否$arg包含abc. 我们将使用grep,但请记住grep查看您给它的文件,或者通过它的标准输入(“stdin”)传递的任何内容。grep "abc" var您给出的将grep试图abc在一个名为var.

我们需要$arg进入grep's stdin. 我们将使用echo将内容放入标准输出(“stdout”)和一个“管道”,它将一个命令的标准输入连接到另一个命令的标准输出:

echo "$arg" | grep abc

上面会将任何内容放入$arg标准输入,然后grep仅在包含abc.

因此完整的脚本如下:

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

这将无法正确处理参数包含换行符的情况;我会把它留给你自己解决的未来问题。

于 2013-01-16T13:22:46.753 回答