首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在shell脚本中的for循环中逐行遍历文本文件。

在shell脚本中的for循环中逐行遍历文本文件。
EN

Stack Overflow用户
提问于 2020-09-03 19:40:09
回答 3查看 214关注 0票数 0

我有一个名为locations.txt的txt文件

代码语言:javascript
复制
location-1a
location-2c
location-3d
location-4
location-5a
...

我希望迭代我的for循环中的locations.txt文件,每个位置应该用于5个节点,然后应该使用下一个位置。例如,我希望运行以下命令,

代码语言:javascript
复制
server create --location location-1a node-1
server create --location location-1a node-2
server create --location location-1a node-3
server create --location location-1a node-4
server create --location location-1a node-5
server create --location location-2c node-6

.....

到目前为止,我只有一个名为script.sh的脚本,它从cli获取一个参数。我不能像我想的那样改变地点。

代码语言:javascript
复制
mapfile -t locationArr < ~/Documents/files/locations.txt
serverCounter=1
locationCounter=1
counter=1

counter=1
for (( i = 1; i <= $1; i++ ))
do
 server create --location $locationArr[$locationCounter] node-$i
 counter=$((counter+1))
 if [ $counter == 5 ]
 then
  counter=1
  locationCounter=$((locationCounter+1))
done

我想要像这样的

代码语言:javascript
复制
if counter == 5:
 counter=0
 nextline 

例如,如果我运行script.sh 11,我希望得到以下结果,

代码语言:javascript
复制
server create --location location-1a node-1
server create --location location-1a node-2
server create --location location-1a node-3
server create --location location-1a node-4
server create --location location-1a node-5
server create --location location-2c node-6
server create --location location-2c node-7
server create --location location-2c node-8
server create --location location-2c node-9
server create --location location-2c node-10
server create --location location-3d node-11

如何在for循环中迭代location.txt文件?我是否应该将文本文件转换为某种列表变量?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-03 19:55:21

这是我的尝试:

代码语言:javascript
复制
counter=1
while IFS= read -r line
do
    for (( i=1; i <= 5 && $counter <= $1; i++ ))
    do
     server create --location $line node-$counter
     counter=$((counter+1))
    done 
done < ~/Documents/files/locations.txt

产出为11:

代码语言:javascript
复制
server create --location location-1a node-1
server create --location location-1a node-2
server create --location location-1a node-3
server create --location location-1a node-4
server create --location location-1a node-5
server create --location location-2c node-6
server create --location location-2c node-7
server create --location location-2c node-8
server create --location location-2c node-9
server create --location location-2c node-10
server create --location location-3d node-11
票数 2
EN

Stack Overflow用户

发布于 2020-09-03 20:05:30

总纲:

用于从locations.txt

  • inner循环读取位置的
  • 外部循环,用于在每次生成节点时为给定位置生成5个节点的最大值,如果计数器>输入' max‘,则增加计数
  • ,然后突破循环

上述措施的一项实施:

代码语言:javascript
复制
max=${1}
curr=1

while read -r location
do
    for i in {1..5}
    do
        echo "server create --location ${location} node-${curr}"
        curr=$((curr+1))
        [ ${curr} -gt ${max} ] && break 2
    done
done < locations.txt

max=${1}=11进行测试运行

代码语言:javascript
复制
server create --location location-1a node-1
server create --location location-1a node-2
server create --location location-1a node-3
server create --location location-1a node-4
server create --location location-1a node-5
server create --location location-2c node-6
server create --location location-2c node-7
server create --location location-2c node-8
server create --location location-2c node-9
server create --location location-2c node-10
server create --location location-3d node-11

OP可以为大于0的整数添加额外的max检查。

票数 1
EN

Stack Overflow用户

发布于 2020-09-03 20:35:48

使用单循环完成,没有Bashism POSIX语法:

代码语言:javascript
复制
#!/usr/bin/env sh

i=0
while [ $i -lt "$1" ] && {
  [ $((i % 5)) -ne 0 ] || IFS= read -r line || [ "$line" ]
}; do
  server create --location "$line" "node-$((i = i + 1))"
done <locations.txt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63730591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档