如何将换行符分隔的列表作为参数传递给另一个命令?

如何将换行符分隔的列表作为参数传递给另一个命令?

因此我有一个用户名列表,例如:

user1
user2
user3

我想id对它们每一个都应用并得到类似的结果:

uid=100(user1) gid=5(g1) groups=5(g1),6(g6),7(g10)
.
.

我该如何实现呢?请注意,列表是另一个命令 say 的输出mycommand

答案1

使用xargs

mycommand | xargs -L1 id

例子:

$ (echo root; echo nobody) | xargs -L1 id
uid=0(root) gid=0(root) groups=0(root)
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)

您还可以在 bash 中循环输入:

mycommand | while read line
do
    id "$line"
done

xargs将输入转换为命令的参数。该-L1选项指示xargs将每一行用作命令调用的唯一参数。

答案2

使用 bash,你可以将输出行捕获到一个数组中:

mapfile -t lines < <(mycommand)

然后迭代它们

for line in "${lines[@]}"; do
    id "$line"
done

这不像 xargs 那样简洁,但如果您需要多行内容,它就非常有用。

答案3

tar -czf reloads.stage.tgz $(find . | egrep "sh$|functions$|sql$|setup$")

首先我进行了测试find/egrep以确保我获得了我想要的列表,然后我将它作为文件列表添加到命令末尾tar

希望这会有所帮助。

  1. find .只是查找当前目录下的所有文件,但是您可以根据需要指定子目录或完全不同的路径。
  2. egrep只允许grep使用竖线 ( |) 分隔多个搜索字符串。
  3. 此后,其余的事情就都说得通了。

相关内容