我的KornShell(ksh)脚本接收命令行参数作为输入。 我的任务是检查这些参数中是否包含 abc ,并仅打印其中包含 abc 的参数。 例如: -
./tree.sh rabc try qwerty
输出应为::
rabc
这就是我的尝试:
var=$*
z=grep "abc" var
echo $z
对此有何见解?
答案 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" var
会grep
尝试在名为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
这将无法正确处理参数包含换行符的情况;我会把这作为未来的问题让你自己解决。