Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash命令以cat多个文件作为变量_Bash_File_Cat - Fatal编程技术网

Bash命令以cat多个文件作为变量

Bash命令以cat多个文件作为变量,bash,file,cat,Bash,File,Cat,我使用的应用程序具有以下语法: mccli backup delete --name=X --labelnum=X 我每次都可以手动执行该命令,如下所示: mccli backup delete --name=server1 --labelnum=12 mccli backup delete --name=server2 --labelnum=33 问题是我有1000台主机要运行此命令。我有一个文件(name.txt)包含所有--name=变量的列表,还有一个文件(labelnum.txt)

我使用的应用程序具有以下语法:

mccli backup delete --name=X --labelnum=X
我每次都可以手动执行该命令,如下所示:

mccli backup delete --name=server1 --labelnum=12
mccli backup delete --name=server2 --labelnum=33
问题是我有1000台主机要运行此命令。我有一个文件(name.txt)包含所有
--name=
变量的列表,还有一个文件(labelnum.txt)包含所有
--labelnum=
变量的列表

我熟悉下面的bash命令,它只适用于一个变量(
--name=
),但我不知道如何使这个bash命令适用于两个变量:

for i in $(cat name.txt); do mccli backup delete --name=$i ; done
这不起作用:

for i in $(cat name.txt) for j in $(cat labelnum.txt); do mccli backup delete --name=$i --labelnum=$j ; done

您可以编写一个bash脚本并创建两个for循环,每个文件一个。如果您确实需要使用shell命令而不是shell脚本,那么您可以使嵌套for循环。 这样的事情看起来有点像这样:

mccli backup delete --name=server1 --labelnum=12
mccli backup delete --name=server2 --labelnum=33

文件名为“name.txt”、“labelnum.txt”;在$filename中为i执行;do mccli备份删除--name=$i;done done

如果我理解正确,您希望从这两个文件的相应行中获取
--name
--labelnum
参数的值。假设第一个文件的行中没有制表符,并且文件的行数相同:

while IFS=$'\t' read -r name label; do
  mccli backup delete --name="$name" --labelnum="$label"
done < <(paste name.txt labelnum.txt)
而IFS=$'\t'读取-r名称标签;做
mccli备份删除--name=“$name”--labelnum=“$label”

完成
for i in $(cat name.txt labels.txt); do mccli backup delete --name=$i ; done
甚至

for i in $(cat *.txt); do mccli backup delete --name=$i ; done

如果文件每行只包含一个参数,则所有文件都可以。

文件的内容是什么样子的?命令con
cat
启用输入文件的内容并将其写入
stdout
。如果
for i in$(cat name.txt)
对您有效,那么
for i in$(cat name1.txt name2.txt)
也应该有效。(另请参见在bash中一次读取一个文件一行的更好方法)我现在猜,第一个变量来自file name.txt,第二个变量来自第二个文件labelnum.txt吗?我很困惑,你在每个文件中谈论多个列。最好是发布每个文件的一小部分,或者提供更多细节。我无法为所有可能的情况提供解决方案。@MaxMuster…第一个变量来自文件“name.txt”,第二个变量来自“labelnum.txt”,这是正确的。我正在尝试为第一个变量(--name=)获取cat'name.txt'命令,为第二个变量(--labelnum=)获取'labelnum.txt'命令。非常确定OP希望从一个文件获取name参数,从另一个文件的对应行获取labelnum参数。他说他希望“对每个文件执行上述命令。”,所以我告诉他怎么做,我怀疑粘贴会更合适,OP只是不知道。除了这个答案的恰当性,还有两个语法问题:第一,你不能用逗号分隔项目($filename将有文本值
name.txt,
);其次,
for i in$filename
只需将$filename的值放入
$i
变量中(除非文件名中有空格),它不会迭代文件的内容。当我尝试该确切语法时,CLI只显示了一个与此完全相同的>@Bryce?没有改变或改动?它对我来说很好(使用echo,因为我没有mccli程序),我需要这个命令同时对--name=变量和--labelnum=变量工作。“name.txt”文件的内容需要是--name=的变量,“labels.txt”文件的内容需要是--labelnum=的变量。为了得到更好的答案,我认为最好提供name.txt和labels.txt的示例以及预期的输出/生成命令。建议正确的语法要容易得多,创建具有不干净需求的解决方案要困难得多