如何在KornShell脚本中搜索字符串中的特定字符?

时间:2013-01-16 10:26:59

标签: shell unix scripting ksh

我的KornShell(ksh)脚本接收命令行参数作为输入。 我的任务是检查这些参数中是否包含 abc ,并仅打印其中包含 abc 的参数。 例如: -

./tree.sh rabc try qwerty

输出应为::

rabc

这就是我的尝试:

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

对此有何见解?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

for arg
do
    <stuff>
done

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

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

我们需要将$arg转换为grep的标准输入。我们将使用echo,将事物置于标准输出(“stdout”)和“管道”,它将一个命令的stdin连接到另一个stdout:

echo "$arg" | grep abc

上面会将$arg中的任何内容放到stdin上,然后grep只有在包含abc时才打印出来。

因此完整的脚本如下:

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

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