【发布时间】:2020-10-03 22:15:47
【问题描述】:
我正在尝试循环传递给 bash 脚本(或其中的函数)的未知数量的参数,以有效地处理赔率($1、$3 等)和偶数($2、 $4 等)以不同的方式。
我知道我可以使用$# 获取参数的数量,使用$@ 获取参数本身,当然echo $1 $2 或printf '%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 question 或 this question。 -
@Socowi - 就是这样。我在 for 循环中尝试了
($@),但在 while 循环中被忽略了。虽然奇怪(((i++))有效,但((i+2))进入无限循环,并且只显示$1。不过,我会看看是否可以修改其他问题中的任何其他问题。谢谢! -
((i+2))计算结果并将其丢弃。你可能想写((i+=2))。没有赋值i保持其初始值,因此无限循环。 -
是的,没错!我的 c 风格算术正慢慢回到我身边。
标签: bash arguments command-line-arguments