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