读入bash脚本并将参数传递给脚本

时间:2015-05-11 18:41:48

标签: bash

我有一个问题。不幸的是,我没有找到任何答案。如何将参数传递给脚本,这是另一个命令的结果。例如:

 ls | ./myscript.sh

我想将ls的结果传递给myscript。如果我执行上面的命令,脚本是:

#!/bin/bash
read some
for arg in $@
do 
     grep $some $arg
done

然后它没等待读取某些变量,而变量 some ls命令传递的结果中获取其值?这实际上有用吗?我想要以下内容:将脚本名称放入文件(使用命令ls),之后用户输入一些字符串,我想打印包含输入单词的每一行。我不知道为什么上面的代码不起作用。 提前谢谢。

2 个答案:

答案 0 :(得分:4)

xargs是用于将stdin输入转换为命令行参数的实用程序。

天真地,您可以执行以下操作:

ls | xargs ./myscript.sh

但是,对于具有嵌入空格的文件名,这将无法正常工作,因为它们将被拆分为多个参数。
请注意,./myscript.sh $(ls)存在同样的问题。

如果您的xargs实现支持非标准-0选项来解析NUL分隔的输入,您可以按如下方式解决此问题:

printf '%s\0' * | xargs -0 ./myscript.sh

否则,请使用以下命令,但是,只有在没有文件名嵌入"个字符(或嵌入的换行符)的情况下才能使用以下内容:

printf '"%s" ' * | xargs ./myscript.sh

在这种情况下,由于您的stdin输入来自文件名,因此您可以使用find,其基本上具有内置的xargs功能:< / p>

find . -type f -maxdepth 1 -exec ./myscript.sh {} +
  • 请注意,find . -type f -maxdepth 1 本质上ls相同,但存在细微差别,特别是每个匹配的文件名都会以./为前缀,文件名可能没有排序。
  • -exec ./myscript.sh {} +使用尽可能多的文件名({})调用您的脚本,因为它可以放在一个命令行(+)上 - 就像xargs那样 - 通常所有

请注意,xargsfind ... -exec ... + 都可以导致指定命令的多次调用,如果不是所有参数都适合单个命令行。
但是,考虑到允许在现代平台上使用多长时间的命令行,这种情况很少发生 - 只有当您的目录中有大量文件和/或它们的名称非常长时才会发生这种情况。

答案 1 :(得分:1)

您可以运行如下命令:

./myscript.sh $(ls)

这将提示用户输入some变量,并通过ls的结果查看包含用户输入值的文件。

但是,您可能会遇到此方法的问题,因为空格和其他字符可能导致for循环接收无效输入。

考虑到这一点,您可能还需要查看findxargsachieve something similar,具体取决于您的脚本的复杂程度。例如:

find . -type f -print0 |xargs -0 grep "test"