【问题标题】:Bash - for loop does not print first objectBash - for 循环不打印第一个对象
【发布时间】:2021-10-01 17:44:14
【问题描述】:

我试图理解为什么我的 for 循环会打印除第一个以外的所有结果:


*#!/bin/bash
#python deploy/bulk.py 
countOuter=0
countInner=0
END=23
for bool in $(seq ${1} $END)#$1 $2  $3  $4  $5  $6  $7  $8  $9 ${10} ${11} ${12} ${13} ${14} ${15} ${16} ${17} ${18} ${19} ${20} ${21} ${22} ${23} 
do
countOuter=$((countOuter+1))*

我的输出开始于: ----------------------------------------------- -------- 平等>> 平等------------------------------- ------------------ -------------------------------------------------- ----- 工作 1000000bet.com 已建成 ---------------------------------------- ------------------------------

如果我不使用这个 $(seq ${1} $END) 而只是 $1 $2 $3 $4 $5 $6 $7 $8 $9....,它有效。

【问题讨论】:

  • 请查看How do I ask a good question?,然后相应地更新问题;特别是...seq ${1} $END$1 $2 $3 ... $23不一样;请使用$1$23 的内容、完整的代码集和完整的输出集更新问题(出于可读性目的,也将格式应用于输出)
  • 我不确定这里发生了什么(或者您期望发生什么),但我认为您可能对 $( ) 的作用感到困惑。
  • 我不能把整个代码,因为有太多的敏感信息。我会尽力解释。有一个 Jenkinsfile 将 true/false 传递给我的 script.sh 文件。我正在使用这些值来确定是否要触发批量作业。
  • 在最后几分钟玩了一段时间后,我意识到这根本不起作用。即使 END=5,它也会继续遍历所有 23 个对象。以愚蠢的方式使用这些值是没有问题的,但在 for 循环中很难实现 range 有点奇怪:)
  • 如果你想要一个简单的范围,那么seq $END 就足够了。你可以使用格式选项来附加$ 这样seq -f "$%g" $END 但它不会工作

标签: bash for-loop


【解决方案1】:

假设:

  • 脚本提供了 23 个输入参数
  • OP 希望处理第一个$END 参数
  • 以后可能需要完整的参数列表,所以我们不想使用shift

使用循环计数器的一个想法:

END=5
pass=0

for bool in "$@"
do
    ((pass++))
    [[ "${pass}" -gt "${END}" ]] && break
    ... process "${bool}" ...
done

另一个使用数组的想法:

END=5
arr=( "$@" )

for ((i=0;i<END;i++))
do
    ... process "${arr[i]}" ...
done

使用间接变量引用的另一个想法:

END=5

for ((i=1;i<=END;i++))
do
    ... process "${!i}" ...
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2019-12-23
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多