【问题标题】:Programatically cycle through arguments given to a script or function以编程方式循环传递给脚本或函数的参数
【发布时间】:2020-10-03 22:15:47
【问题描述】:

我正在尝试循环传递给 bash 脚本(或其中的函数)的未知数量的参数,以有效地处理赔率($1$3 等)和偶数($2$4 等)以不同的方式。

我知道我可以使用$# 获取参数的数量,使用$@ 获取参数本身,当然echo $1 $2printf '%s\n' "$1" 都可以。我需要做的是有效地用未知数字回应赔率echo $1 $3 $5 ...,然后分别处理偶数,并单独计算这些字符,所以如果可能的话,需要以编程方式获取这些。

注意:有些输入会有空格,但 where 总是会有引号。一个例子是1 "This one" "Another one" "and another" "last one"

我试过了(这些只是为了简洁起见):

$@ 放入自身的数组中,在 for 和 while 安排中(理解这个零索引数组):

indexedarray="$@"
for i in {0..$#..2}; do #This in itself creates an error ({0..5..2}: syntax error: operand expected (error token is "{0..5..2}")).
  echo -n "${indexedarray[$i]}
done

这会产生空输出:

i=0
while [ $i -lt $# ]; do
    echo ${INDEXEDARRAY[i]}
    ((i+2))
done

以及 for 或 while 循环内部的(有些)明显的弱点:

  echo "${$@[$i]}"
  echo $"${i}"

这些都不起作用。

关于如何改进这一点并获得我需要的输出的任何想法?

【问题讨论】:

  • indexedarray="$@" 没有定义一个数组而是一个字符串。请改用indexedarray=("$@")
  • {0..$#} 不起作用,因为大括号在变量之前展开,请参阅this question。有关如何在没有 $1$2、... 的情况下访问命令行参数的示例,请参阅 this questionthis question
  • @Socowi - 就是这样。我在 for 循环中尝试了($@),但在 while 循环中被忽略了。虽然奇怪(((i++)) 有效,但((i+2)) 进入无限循环,并且只显示$1。不过,我会看看是否可以修改其他问题中的任何其他问题。谢谢!
  • ((i+2)) 计算结果并将其丢弃。你可能想写((i+=2))。没有赋值 i 保持其初始值,因此无限循环。
  • 是的,没错!我的 c 风格算术正慢慢回到我身边。

标签: bash arguments command-line-arguments


【解决方案1】:

您似乎想打印所有其他参数。以下是一些方法。

我最喜欢的(尽管有点老套):

printf '%s\n%.0s' "$@"

下一个合乎逻辑的方法

while (($# > 0)); do
  echo "$1"
  shift
  shift
  # `shift 2` won't shift if there is only one argument left
done

以及最通用的方法

a=("$@")
for ((i=0; i<$#; i+=2)); do
  echo "${a[i]}"
done

【讨论】:

  • 所以我从this answer发现,还有${!i}这个名称,非常适合我的需求,无需定义单独的数组。
  • while x=$1 &amp;&amp; shift; do echo "$x"; shift; done 也可以。条件中的shift 兼作越过当前参数的方式以及测试x 是否被赋值。正文中的shift 继续跳过参数。
  • for _; do echo "$1"; shift; shift; done 也可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多