文档章节

如何遍历Bash中变量定义的数字范围?

j
 javail
发布于 2019/12/08 15:07
字数 727
阅读 62
收藏 0

当变量给定范围时,如何在Bash中迭代数字范围?

我知道我可以做到这一点(在Bash 文档中称为“序列表达式”):

 for i in {1..5}; do echo $i; done

这使:

1个
2
3
4
5

但是,如何用变量替换两个范围端点? 这不起作用:

END=5
for i in {1..$END}; do echo $i; done

哪些打印:

{1..5}


#1楼

您可以使用

for i in $(seq $END); do echo $i; done

#2楼

for i in $(seq 1 $END); do echo $i; done

编辑:我比其他方法更喜欢seq ,因为我实际上可以记住它;)


#3楼

这在bash可以正常工作:

END=5
i=1 ; while [[ $i -le $END ]] ; do
    echo $i
    ((i = i + 1))
done

#4楼

讨论区

正如Jiaaro所建议的,使用seq很好。 Pax Diablo建议使用Bash循环来避免调用子进程,另外的好处是,如果$ END太大,则对内存更友好。 Zathrus发现了循环实现中的一个典型错误,并且还暗示由于i是文本变量,因此在关联的减慢下执行往返数字的连续转换。

整数算术

这是Bash循环的改进版本:

typeset -i i END
let END=5 i=1
while ((i<=END)); do
    echo $i
    …
    let i++
done

如果我们唯一想要的就是echo ,那么我们可以编写echo $((i++))

短暂性教会了我一些东西:Bash允许for ((expr;expr;expr))构造。 由于我从未读过Bash的整个手册页(就像我对Korn shell( ksh )手册页所做的那样,并且很久以前),所以我错过了。

所以,

typeset -i i END # Let's be explicit
for ((i=1;i<=END;++i)); do echo $i; done

似乎是最有效的内存使用方式(不必分配内存来消耗seq的输出,如果END很大,可能会出现问题),尽管可能不是“最快”的。

最初的问题

eschercycle指出,{ a .. b } Bash表示法仅适用于文字。 符合Bash手册。 可以使用一个(内部) fork()而无需exec()来克服这一障碍(就像调用seq的情况一样,这是另一个映像,需要fork + exec):

for i in $(eval echo "{1..$END}"); do

evalecho都是Bash内置eval ,但是命令替换( $(…)构造)需要fork() )。


#5楼

seq方法是最简单的,但是Bash具有内置的算术评估。

END=5
for ((i=1;i<=END;i++)); do
    echo $i
done
# ==> outputs 1 2 3 4 5 on separate lines

for ((expr1;expr2;expr3)); 构造的工作方式与C和类似语言中的for (expr1;expr2;expr3)一样,并且与其他((expr))情况一样,Bash将其视为算术运算。

本文转载自:https://it.sofbug.com/question/i63

j
粉丝 3
博文 764
码字总数 0
作品 0
深圳
私信 提问
你所不了解的 Bash:关于 Bash 数组的介绍

进入这个古怪而神奇的 Bash 数组的世界。 尽管软件工程师常常使用命令行来进行各种开发,但命令行中的数组似乎总是一个模糊的东西(虽然不像正则操作符 那么复杂隐晦)。除开隐晦和有疑问的语...

03%
2018/07/15
0
0
通过编写扫雷游戏提高你的 Bash 技巧

那些令人怀念的经典游戏可是提高编程能力的好素材。今天就让我们仔细探索一番,怎么用 Bash 编写一个扫雷程序。 我在编程教学方面不是专家,但当我想更好掌握某一样东西时,会试着找出让自己...

作者: Abhishek Tamrakar
2019/10/07
0
0
bash脚本之case语句应用,while、until和select循环应用及其示例

bash脚本编程: case选择分支结构: case: case 词 in [模式 [| 模式]...) 命令 ;;]... esac 在脚本中使用case的结构: case ${VAR_NAME} in PATTERN1) COMMAND ... ;; PATTERN2) COMMAND ....

花花很漂漂
2017/12/04
0
0
Linux自学笔记——bash的基础特性

Bash的基础特性(1) 1.命令历史history 环境变量; HISTSIZE:命令历史记录的条数; HISTFILE:~/.bash_history HISTFILESIZE;命令历史文件记录历史的条数; 调用上一条命令的最后一个参数...

claude_liu
2017/09/19
0
0
【2018.07.13学习笔记】【linux高级知识 20.10-20.15】

20.10 for循环 语法格式: 示例:计算1到10的累加和 示例:针对文件的循环,遍历每个ls的结果值判断是否为目录,然后ls该目录。 示例:/lgs/ 目录下 touch 1 2 touch 3 4.txt (文件名是3 4.t...

lgsxp
2018/07/16
28
0

没有更多内容

加载失败,请刷新页面

加载更多

什么是专用字节,虚拟字节,工作集?

我试图使用perfmon Windows实用程序来调试进程中的内存泄漏。 这就是perfmon解释这些术语的方式: Working Set是此过程的工作集的当前大小(以字节为单位)。 工作集是过程中线程最近触及的一...

技术盛宴
26分钟前
52
0
创建重复N次的单个项目的列表

我想创建一系列长度不一的列表。 每个列表将包含相同的元件e ,重复n次(其中n列表=长度)。 如何创建列表,而不为每个列表使用列表[e for number in xrange(n)] ? #1楼 在Python中创建重复...

javail
42分钟前
64
0
为什么图片反复压缩后普遍会变绿,而不是其他颜色?

作者:Lion Yang 链接:https://www.zhihu.com/question/29355920/answer/119088684 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 业余版概要:安卓的...

shzwork
今天
47
0
每天AC系列(二):最接近的三数之和

1 题目 leetcode第16题,给定一个数组与一个目标数,找出数组中其中的三个数,这三个数的和要与目标数最接近。 2 暴力 按惯例先来一次O(n3)的暴力: int temp = nums[0]+nums[1]+nums[2];fo...

Blueeeeeee
今天
46
0
EFK教程(5) - ES集群开启用户认证

基于ES内置及自定义用户实现kibana和filebeat的认证 作者:“发颠的小狼”,欢迎转载 目录 ▪ 用途 ▪ 关闭服务 ▪ elasticsearch-修改elasticsearch.yml配置 ▪ elasticsearch-开启服务 ▪ ...

小慢哥
今天
58
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部