首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >for循环在bash中退出到早期,没有错误。

for循环在bash中退出到早期,没有错误。
EN

Stack Overflow用户
提问于 2016-10-21 21:22:11
回答 1查看 42关注 0票数 0

为什么我的for循环: for ((i=1,;i<=$n,i++))不能工作?我搞不懂这事。例如,当n为4时,行echo $n返回4,但不会再次进入循环。我也没有任何错误。我试着做一个小循环,比如:

代码语言:javascript
复制
for ((i=1, i<=$n; i++)); do 
    echo "this works" 
done

这件事做得很好,对我来说就更奇怪了。提前感谢

代码语言:javascript
复制
read n
length=16
p=()
p[1]=50
rest=63
function s() {
    arr=($@)
    line="_____________________________________________________________________"
    for i in ${arr[@]}; do
        line=$( echo $line |  sed s/./1/$i)
    done
    echo $line
}
for ((i=1; i<=$n; i++)); do
    echo $n
    for ((j=1; j<=$length; j++)); do
        s ${p[@]}
    done
    len=${#p[@]}
    ((len=$len*2))
    for ((k=1; k<=$len; k+=2)); do
        ((p[$k+1]=p[$k]+1))
        ((p[$k]=p[$k]-1))
    done
    for ((l=1; l<=$length; l++)); do
        s ${p[@]}
        len=${#p[@]}
        for ((m=1; m<=$len; m+=2)); do
            ((p[$m+1]=p[$m+1]+1))
            ((p[$m]=p[$m]-1))
        done
    done
    ((rest=$rest-2*$length))
    ((length=$length/2))
done
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-21 21:33:48

如果不声明变量为局部变量,它们是全局的--因此s函数中的循环覆盖函数外部使用的相同的i计数器,从而导致外部循环的早期退出。

考虑使用以下代码:

代码语言:javascript
复制
s() {
    local -a arr  # declare a function-local array (sparse, like all bash arrays)
    local i       # ...and a function-local counter

    for i; do     # by default, a for statement iterates over "$@"; that works for us.
      arr[$i]=1   # specifically set a value only for named items
    done

    # ...thereafter, iterate through the range of characters we want to print...
    for ((i=0; i<70; i++)); do
      printf '%s' "${arr[$i]:-_}" # and print the array entry if present, or an _ otherwise
    done
    printf '\n'                   # ...followed by a trailing newline.
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40185624

复制
相关文章

相似问题

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