文档章节

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
                             *
                            ***
                           *****
                          *******
                         *********
                        ***********
                       *************
                      ***************
                     *****************
                    *******************
                   *********************
                  ***********************
                 *************************
                ***************************
               *****************************
              *******************************
             *********************************
            ***********************************
           *************************************
          ***************************************
         *****************************************
        *******************************************
       *********************************************
      ***********************************************
     *************************************************
    ***************************************************
   *****************************************************
  *******************************************************
 *********************************************************
***********************************************************

 

© 著作权归作者所有

共有 人打赏支持
胡子叭槎
粉丝 21
博文 126
码字总数 132998
作品 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循环,它们的语法和...

无心下棋
05/13
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
C Primer Plus 第11章 11.6 字符串例子:字符串排序

我们来解决一个把字符串按字母表顺序排序的问题。准备花名册、建立索引以及很多其他情况下都会用到字符串排序。这个程序的一个主要工具就是strcmp( ),因为可以使用这个函数来决定两个字符串...

idreamo
2016/08/27
30
0
给妹子讲python-S01E13循环迭代高级技巧

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

技术小能手
08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于Excel表格导出方法--application/vnd.ms-excel

关于Excel表格导出方法--application/vnd.ms-excel 由于本人所做的项目中需要用到两种将JSP页面table导出到Excel表格的方法(老板也是坑爹),一种是在后台操作数据库来实现,比较简单。由于...

DemonsI
30分钟前
2
0
springboot配置读写分离

我不提供内容,我只是好文章的搬运工 https://www.cnblogs.com/wuyoucao/p/9610882.html

颖辉小居
34分钟前
2
0
Spring 传参

spring传参之@RequestParam注解 @RequestParam注解有三个参数分别是: value、 required、 defaultValue 代码: @RequestMapping(value="test1", method = RequestMethod.GET) public String......

休辞醉倒
36分钟前
2
0
go http 框架性能大幅下降原因分析

最近在开发一个web 框架,然后业务方使用过程中,跟我们说,压测qps 上不去,我就很纳闷,httprouter + net/http.httpserver , 性能不可能这么差啊,网上的压测结果都是10w qps 以上,几个m...

鼎铭
36分钟前
17
0
GCC编译过程记

GCC编译过程记 一、引言 对于编程工作者来说,GCC是一个熟悉的名字,它的全称是“GNU Compiler Collection”。GCC是一组编译器集合,目前其支持C、C++、Objective-C、Objective-C++、Go和RBI...

珲少
37分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部