【问题标题】:Bash command to cat multiple files to be used as a variableBash 命令对多个文件进行分类以用作变量
【发布时间】:2020-04-19 16:39:50
【问题描述】:

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

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

【问题讨论】:

  • 文件的内容是什么样的?
  • cat 命令 concatenates 输入文件的内容并将它们写入stdout。如果for i in $(cat name.txt) 适合您,那么for i in $(cat name1.txt name2.txt) 也应该可以。
  • (另请参阅mywiki.wooledge.org/BashFAQ/001,了解在 bash 中一次读取单个文件的更好方法)
  • 我现在猜,第一个变量来自 name.txt 文件,第二个变量来自第二个文件 labelnum.txt 吗?我很困惑,您谈论每个文件中的多个列。最好是发布每个文件的一小部分,或者简单地提供更多细节。我无法为所有可能的情况提供解决方案。
  • @MaxMuster...您是正确的,第一个变量来自文件“name.txt”,第二个变量来自“labelnum.txt”。我正在尝试为第一个变量(--name=)获取命令以 cat 'name.txt',为第二个变量(--labelnum=)获取'labelnum.txt'。

标签: bash file cat


【解决方案1】:

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

while IFS=$'\t' read -r name label; do
  mccli backup delete --name="$name" --labelnum="$label"
done < <(paste name.txt labelnum.txt)

应该这样做。

【讨论】:

  • 当我尝试那个确切的语法时,CLI 只显示了一个 >
  • @Bryce 完全是这样吗?没有变化或改动?它对我来说很好用(使用 echo 因为我没有 mccli 程序)。
【解决方案2】:

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

对于“name.txt”中的文件名,“labelnum.txt”;在 $filename 中为 i 执行;做 mccli 备份删除 --name=$i ;搞定了

【讨论】:

  • 相当肯定 OP 想要从一个文件中获取 name 参数,并从另一个文件的相应行获取 labelnum 参数。
  • 好吧,他说他想“对每个文件执行上述命令。”,所以我告诉他该怎么做
  • 我怀疑paste 会更合适,而 OP 只是不知道。
  • 除了这个答案的适当性之外,还有两个语法问题:首先,您不要用逗号分隔项目($filename 将具有文字值name.txt,);第二个for i in $filename 将简单地将$filename 的值放入$i 变量中(除非文件名中有空格),它不会遍历文件的内容。
【解决方案3】:

cat 命令理解多个参数和文件掩码,所以

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

如果文件每行只包含一个参数,一切都应该没问题。

【讨论】:

  • 我需要这个命令同时为 --name= 变量和 --labelnum= 变量工作。 “name.txt”文件的内容需要是--name=的变量,“labels.txt”文件的内容需要是--labelnum=的变量
  • 为了获得更好的答案,我认为最好提供 name.txt 和 labels.txt 的示例以及预期的输出/生成的命令。建议正确的语法要容易得多,而要创建具有不明确要求的解决方案则要困难得多
猜你喜欢
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2021-06-11
  • 2013-07-18
相关资源
最近更新 更多