如何正确地在“a”中使用大括号;for loop";BASH到位置参数?
当我尝试在BASH中编写此函数时如何正确地在“a”中使用大括号;for loop";BASH到位置参数?,bash,loops,for-loop,expansion,braces,Bash,Loops,For Loop,Expansion,Braces,当我尝试在BASH中编写此函数时 function Odds () for i in {1..${#@}..2} ; do echo $i; done 我期望有这样的输出 135 取决于传递给函数的参数数 但是有效的输出是扩展了${#@}的字符串 前 {1..5..2} 我有一些猜测,但是。。。任何离开。。。发生了什么以及如何避免这种情况并获得理想的输出?尝试以下方法: function Odds () { for i in {1..${@}..2} ; do echo $i; done }
function Odds () for i in {1..${#@}..2} ; do echo $i; done
我期望有这样的输出
135
取决于传递给函数的参数数
但是有效的输出是扩展了${#@}的字符串
前
{1..5..2}
我有一些猜测,但是。。。任何离开。。。发生了什么以及如何避免这种情况并获得理想的输出?尝试以下方法:
function Odds () { for i in {1..${@}..2} ; do echo $i; done }
或
问题是支架展开是在参数替换之前进行的。因此,大括号展开不能与变量一起使用
备选案文1:如下
如果已安装seq
(这在Linux上很常见),请尝试:
seq 12“${{}”
每次返回以1
开头并递增2
的数字,直到到达${}
例如:
$ Odds a b c d e
1
3
5
注意:函数
符号不是必需的,它限制了兼容性(不是POSIX)<代码>赔率可以在没有它的情况下定义:
Odds () { seq 1 2 "${#@}"; }
选项2:bash
或者,仅使用bash定义:
function Odds () { for ((i=1; i<=${#@}; i=i+2)); do echo "$i"; done; }
备选案文3:POSIX
要获得最广泛的兼容性,请使用符合POSIX标准的函数:
Odds() { i=1; while [ "$i" -le "$#" ]; do echo "$i"; i=$((i+2)); done; }
你试过了吗?我真的很喜欢你的评论。特别是这一条:“问题是大括号扩展是在参数替换之前完成的。”我试图避免使用
seq
,寻找更“纯粹”的bash代码。不管怎样,谢谢你!为了学习Propose,我正在尝试学习最可移植的编码方式。@Danielbandera为了最可移植的编码方式,应该使用符合标准的代码。这是上面(新增的)选项3。
function Odds () { for ((i=1; i<=${#@}; i=i+2)); do echo "$i"; done; }
$ Odds a b c d e
1
3
5
Odds() { i=1; while [ "$i" -le "$#" ]; do echo "$i"; i=$((i+2)); done; }