for 循环中的一个小技巧
for 循环中的一个小技巧
胡子叭槎 发表于1年前
for 循环中的一个小技巧
  • 发表于 1年前
  • 阅读 22
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

      开始学习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
                             *
                            ***
                           *****
                          *******
                         *********
                        ***********
                       *************
                      ***************
                     *****************
                    *******************
                   *********************
                  ***********************
                 *************************
                ***************************
               *****************************
              *******************************
             *********************************
            ***********************************
           *************************************
          ***************************************
         *****************************************
        *******************************************
       *********************************************
      ***********************************************
     *************************************************
    ***************************************************
   *****************************************************
  *******************************************************
 *********************************************************
***********************************************************

 

标签: for循环
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 20
博文 125
码字总数 130102
×
胡子叭槎
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: