如何在命令中插入循环

时间:2018-02-20 00:55:13

标签: linux bash shell centos7

例如:命令( - 选项* 4次)

我可以在这里使用for循环吗?请建议!

换句话说

command --option1 --option2 --option3 --option3 --option3

所以我想在循环中使用option3。

2 个答案:

答案 0 :(得分:1)

请参阅BashFAQ #50,了解为什么天真尝试解决此问题的尝试经常失败(或者最初似乎有效,但在使用更有趣的数据或更有问题的情况时失败)。

遵循最佳做法谨慎的做法可能如下:

#!/usr/bin/env bash

number_of_option3s=4
args=( )
for ((i=0; i<number_of_option3s; i++)); do
  args+=( --option3 )
done

your_command --option1 --option2 "${args[@]}"

据推测,在一个真实世界的用例中,您要修改args+=( --option="$i" )或迭代文件名并执行for file in *.txt; do args+=( --input "$file" ); done之类的操作;所有这些都可行。

如果您没有使用bash运行,而是需要使用/bin/sh,那么这会变得更加丑陋:

#!/bin/sh

# need to use a function since there's only one array, "$@", but it has a separate
# instance per stack depth.
call_with_repeated_option() {
  number_of_options=$1; shift
  option_to_append=$1; shift
  i=0
  while [ "$i" -lt "$number_of_options" ]; do
    set -- "$@" "$option_to_append"
    i=$((i + 1))
  done
  "$@"
}

# call your_command with 4 "--option3" arguments after --option1 and --option2
call_with_repeated_option 4 --option3 your_command --option1 --option2

答案 1 :(得分:-2)

使用:

echo "--option"{0..3}
--option0 --option1 --option2 --option3

 echo "--option"{1,2,3,3,3}
--option1 --option2 --option3 --option3 --option3

这里,使用“--option”调用命令echo,粘贴到(0到3)扩展的结果,或者在第二种情况下,使用逗号分隔的元素列表。

echo "--option"{1..13..4}
--option1 --option5 --option9 --option13

这个相关的构造是按4读取1到13.

达菲爵士在命令中提出的要求是一个不同的问题,但很容易以类似的方式解决:

echo command $(echo "--option=\""{a.file,b.file,d.file,e.file}"\"" )
command --option="a.file" --option="b.file" --option="d.file" --option="e.file"