2013-01-16 106 views
1

我的KornShell(ksh)脚本接收命令行参数作为输入。 我的任务是检查这些参数是否包含abc,并只打印那些含有abc的参数。 例如: -如何在KornShell脚本中搜索字符串中的特定字符?

./tree.sh rabc try qwerty 

输出应该是::

rabc 

这是我曾尝试:

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

任何有识之士对此?

+0

如果您还显示您尝试过的内容,这将有所帮助。其他人则可以帮助你了解哪里出了问题。简单地提供一个需求并希望其他人给你提供完整的解决方案通常在[so]上被忽视。 –

+0

你试过的是什么问题?你是如何解决它的? –

回答

1

首先,您需要能够遍历参数。如果我们看一看man ksh,我们发现以下:

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

每次执行for命令时,vname设置为从in word名单采取的下一个word。如果省略in word ...,则for命令对从1开始设置的每个位置参数执行do list(参见下面的参数扩展)。当列表中没有更多单词时,执行结束。我们正在运行<stuff>

for arg 
do 
    <stuff> 
done 

在点,$arg将传入的参数之一,注意你所需要的:

所以得到循环,我们需要这样的事情。 $部分在前面; ksh要求这个知道使用存储在变量中的值,而不仅仅是原来的变量名。

接下来,我们需要确定$arg是否包含abc。我们将使用grep,但请记住grep通过您提供的文件或通过标准输入(“标准输入”)传入的内容进行查看。您提供的grep "abc" var将有grep尝试在名为var的文件中查找abc

我们需要将$arg转换为grep的标准输入。我们将使用echo,这使事情到标准输出(“标准输出”)和“管”,其中加入一个命令的标准输入到另一个的stdout:

echo "$arg" | grep abc 

上面会放置任何在$arg到标准输入,那么grep只有在包含abc时才会打印。

因此,完整的脚本如下:

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

这将不能正确处理其中的参数包含换行符的情况;我会把它作为未来的问题让你解决问题。

+0

我可以存储由echo“$ arg”返回的值吗?在变量中的grep abc?因为当我做var = echo“$ arg”| grep abc,$ var中没有显示任何内容..请帮助 – user1466466

+0

@ user1466466:您需要使用“命令替换”:'var = $(echo“$ arg”| grep abc)'。如果没有这些,ksh无法告诉您想要存储字符串“echo ...”,并且希望将运行该字符串的输出存储为命令。 –