侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

for 循环中的一个小技巧

2023-12-14 星期四 / 0 评论 / 0 点赞 / 104 阅读 / 3588 字

开始学习shell的时候使用for循环我们都遇到过在for循环中无法使用变量的例子,比如 for i in {1..$tmp} 这个时候我们打出来的$i 会直接把{1..$tmp} 看做一个字符串打印

      开始学习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.sh1 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.shabcd

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

 

广告 广告

评论区