Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确地在“a”中使用大括号;for loop";BASH到位置参数?_Bash_Loops_For Loop_Expansion_Braces - Fatal编程技术网

如何正确地在“a”中使用大括号;for loop";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 }

当我尝试在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 }

问题是支架展开是在参数替换之前进行的。因此,大括号展开不能与变量一起使用

备选案文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; }