【问题标题】:Pass list of arguments to a command in shell将参数列表传递给 shell 中的命令
【发布时间】:2014-09-15 02:51:27
【问题描述】:

如果我有一个文件列表说file1 ... file20,我如何运行一个以文件列表作为参数的命令,例如myccommand file1 file2 ... file20?

【问题讨论】:

  • 你有一个列表在哪里?在数组变量中?在一个文件中?在你的论点向量中?其他地方?
  • 好问题。我以为@rhlee 的意思是访问命令行参数,但也许不是。
  • 目录中的文件列表,我使用seq 命令创建的。
  • 一个列表如何存储?存储在标量变量中的列表?存储在文件中的列表?存储在数组中的列表?我还是不明白你说的“列表”是什么意思。

标签: shell command-line-arguments


【解决方案1】:

如果您要生成带有seq 的文件列表,则只需使用命令替换将它们放入命令行:

mycommand $(seq ...)

虽然如果这样生成的文件名中包含任何空格(或制表符或换行符...),这将失败。

您还可以使用 bash 的花括号扩展来生成它们,而不是使用 seq,例如 file{1..10} 来生成 file1 file2 file3 file4 file5 file6 file7 file8 file9 file10。这样做的好处是即使文件名在公共部分包含空格,只要您正确引用它(例如"file name"{1..10})。

【讨论】:

  • 是的,大括号扩展有效。很遗憾,我无法将多个答案标记为“正确答案”。
  • 好吧,我的那部分答案与你接受的那一部分是多余的。我完全回答的唯一原因是因为您添加了关于 seq 的评论尚未解决。不确定是否足以将这个答案留在这里..
【解决方案2】:

如果您的列表在您的参数向量中 - 也就是说,如果您开始使用:

./yourscript file1 file2 ...

然后你会跑

mycommand "$@"

如果您的列表在数组中:

mycommand "${my_list_of_files[@]}"

如果您的列表位于以 NUL 分隔的文件中:

xargs -0 -- mycommand <file_with_argument_list

如果您的列表位于换行符分隔的文件中(您永远不应该对文件名这样做,因为文件名可以合法地包含换行符):

readarray -t filenames <file_with_argument_list
mycommand "${filenames[@]}"

如果通过“列表”,你只是意味着你有一个文件序列:

mycommand file{1..20}

【讨论】:

  • 是的,很抱歉造成混淆,“列表”是指文件序列。 mycommand file{1..20} 工作得很好,谢谢。
【解决方案3】:

查看shift bash 命令(man bash)。您可以迭代,每次取 $1

for n in $(seq 1 $#); do
  echo $1
  shift
done

将此文件称为myshift.sh。那么

$ ./myshift.sh a b c 
a
b
c

【讨论】:

  • for 循环已经有一种迭代命令行参数的标准方法。这只是for n; do echo "$n"; done的非标准写法。
  • @chepner 我不知道。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
相关资源
最近更新 更多