文档章节

for 循环中的一个小技巧

胡子叭槎
 胡子叭槎
发布于 2016/10/30 12:53
字数 501
阅读 24
收藏 0

      开始学习shell的时候使用for循环我们都遇到过在for循环中无法使用变量的例子,比如 for i in {1..$tmp} 

这个时候我们打出来的$i 会直接把{1..$tmp} 看做一个字符串打印出来,而不是我们想要的循环结果。下面用eval 可以解决。

  1 #!/bin/bash
  2 #
  3 #
  4 #
  5 # Aut wangzilong
  6 # Shell Document
  7 tmp=10
  8 for i in {1..$tmp}
  9     do
 10       eval  echo $i
 11     done

运行结果:

[root@wzlvm tmp]# sh 1.sh
1 2 3 4 5 6 7 8 9 10

OK 解决问题

上面的例子虽然把循环中i的值打印出来了,但是如果需要把i中的值作为一个参数依然无法解决错误:

16 array2=(1 2 3 4)
 17 num=${#array2[*]}
 18 num=$[num-1]
 19 for i in {1..$num}
 20     do
 21         eval echo ${array2[$i]}
 22     done

# 上面的代码会报错
2.sh: line 21: {1..3}: syntax error: operand expected (error token is "{1..3}")

所以我们可以用seq很容易解决

  1 #!/bin/bash
  2 #
  3 #
  4 #
  5 # Aut wangzilong
  6 # Shell Document
  7 i=10
  8 array=('a' 'b' 'c' 'd')
  9 num=${#array[*]}
 10 num=$[num-1]
 11 for j in $(seq 0 $num)
 12     do
 13         echo ${array[$j]}
 14     done

# 上面的代码运行结果:
[root@wzlvm tmp]# sh 2.sh
a
b
c
d

OK解决问题,用这个办法可以解决for循环的正序倒序,动态数组遍历都可以。

通过上面的方式我们可以打印一个金字塔:

  1 #!/bin/bash
  2 #
  3 # 打印一个正立的金字塔
  4 #
  5 # Aut wangzilong
  6 # Shell Document
  7 
  8 if [ $# -lt 1 ];then
  9     echo '请输入金字塔行数'
 10 else
 11 #  1 外部按行循环
 12 num=$1
 13 for i in $(seq 1 1 $num)
 14     do
 15 #  2 内部每一行先循环打印空格
 16        for j1 in $(seq 1 1 $[num-i])
 17            do
 18                printf ' '
 19            done
 20 #  3 内部每一行再循环打印*
 21        for j2 in $(seq 1  $[i*2-1])
 22            do
 23                printf '*'
 24            done
 25     printf '\n'
 26     done
 27 fi
[root@wzlvm tmp]# sh 2.sh 30
                             *
                            ***
                           *****
                          *******
                         *********
                        ***********
                       *************
                      ***************
                     *****************
                    *******************
                   *********************
                  ***********************
                 *************************
                ***************************
               *****************************
              *******************************
             *********************************
            ***********************************
           *************************************
          ***************************************
         *****************************************
        *******************************************
       *********************************************
      ***********************************************
     *************************************************
    ***************************************************
   *****************************************************
  *******************************************************
 *********************************************************
***********************************************************

 

© 著作权归作者所有

共有 人打赏支持
胡子叭槎
粉丝 22
博文 128
码字总数 134275
作品 0
成都
数据库管理员
私信 提问
12个非常有用的JavaScript 技巧

在这篇文章中,我将分享12个非常有用的JavaScript 技巧。这些技巧可以帮助你减少并优化代码 1)使用!!操作符转换为布尔类型 有时,我们需要检查一些变量是否存在,或者它是否具有有效值,将它...

陈安一
2017/06/19
0
0
Kotlin2.4while和for循环

Kotlin的迭代应该是和Java最接近的。while循环和Java完全一样。for循环仅以唯一一种形式存在,和Java的for-each循环一直。 2.4.1while循环 Kotlin中有while循环和do-while循环,它们的语法和...

无心下棋
2018/05/13
0
0
【译】你不知道的 Chrome 调试工具技巧 第十二天:忍者日志打印!(the ninja logs)

特别声明 本文是作者 Tomek Sułkowski 发布在 medium 上的一个系列。据作者透露一共有 24 篇,一直更新到 12 月 24 日 版权归原作者所有。 作者在Twitter上推荐我们的中文翻译啦,截图在最后...

dendoink
2018/12/17
0
0
Linux 用户的 3 个命令行小技巧

Linux 用户的 3 个命令行小技巧 原文:http://www.tecmint.com/useful-linux-hacks-commands/作者: Avishek Kumar 译文:LCTT https://linux.cn/article-5635-1.html译者: goreliu Linux世......

Carl_
2015/06/17
0
0
给妹子讲python-S01E13循环迭代高级技巧

今天我们来讲讲三种循环迭代的常用技巧,range、zip和enumerate 内置函数range:用来返回一系列连续增加的整数 这个函数产生的连续增加的整数序列,可以作为for循环迭代的索引 range也可以用...

技术小能手
2018/08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Cookie 显示用户上次访问的时间

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.serv......

gwl_
今天
1
0
网络编程

第14天 网络编程 今日内容介绍  网络通信协议  UDP通信  TCP通信 今日学习目标  能够辨别UDP和TCP协议特点  能够说出UDP协议下两个常用类名称  能够说出TCP协议下两个常用类名称...

stars永恒
今天
1
0
二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
3
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
2
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部