我有一个问题。不幸的是,我没有找到任何答案。如何将参数传递给脚本,这是另一个命令的结果。例如:
ls | ./myscript.sh
我想将ls
的结果传递给myscript
。如果我执行上面的命令,脚本是:
#!/bin/bash
read some
for arg in $@
do
grep $some $arg
done
然后它没等待读取某些变量,而变量 some 从ls
命令传递的结果中获取其值?这实际上有用吗?我想要以下内容:将脚本名称放入文件(使用命令ls),之后用户输入一些字符串,我想打印包含输入单词的每一行。我不知道为什么上面的代码不起作用。
提前谢谢。
答案 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
那样 - 通常所有。xargs
和find ... -exec ... +
都可以导致指定命令的多次调用,如果不是所有参数都适合单个命令行。
但是,考虑到允许在现代平台上使用多长时间的命令行,这种情况很少发生 - 只有当您的目录中有大量文件和/或它们的名称非常长时才会发生这种情况。
答案 1 :(得分:1)
您可以运行如下命令:
./myscript.sh $(ls)
这将提示用户输入some
变量,并通过ls
的结果查看包含用户输入值的文件。
但是,您可能会遇到此方法的问题,因为空格和其他字符可能导致for循环接收无效输入。
考虑到这一点,您可能还需要查看find
和xargs
到achieve something similar,具体取决于您的脚本的复杂程度。例如:
find . -type f -print0 |xargs -0 grep "test"