我的 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
设置为word
从in 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
这将无法正确处理参数包含换行符的情况;我会把它留给你自己解决的未来问题。