shell学习3---for循环

for循环格式

基本格式

for 变量名称(注意是名称不是变量$等) [ in 名称范围 ] (可以不写)

do

执行内容 (若满足循环则做什么动作)

done (for循环结束标志)

名称范围是字符

[root@server1 ~]# ./for_test.sh
1
2
3
4
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for i in {1,2,3,4}
do
  echo "$i"
done

名称范围是一个文件

[root@server1 ~]# ./for_test.sh
a
b
c
d
e
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for i in `cat 1.txt`
do
  echo "$i"
done
[root@server1 ~]# cat 1.txt
a
b
c
d
e
类C语言格式

for (( 表达式1 ;表达式2;表达式3 ))

do

执行内容 (若满足循环则做什么动作)

done (for循环结束标志)

[root@server1 ~]# ./for_test.sh
1
2
3
4
5
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for ((i=1;i<=5;i++))
do
  echo "$i"
done

seq

seq 是一个 Linux/Unix 命令,用于生成一个序列(sequence)并打印出来。

格式

seq 2 (起始数) 2(间隔数) 10(终止数)

[root@server1 ~]# seq 2 2 10
2
4
6
8
10
[root@server1 ~]# seq 10 -2 1
10
8
6
4
2
seq结合for循环
[root@server1 ~]# ./for_test.sh
1
3
5
7
9
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for i in `seq 1 2 10`
do
  echo "$i"
done

跳出循环

break和continue命令是控制循环流程重要命令。

continue跳出循环

continue跳出循环:满足continue条件时跳出循环,但是不影响后续循环执行。

它的作用是在循环内部跳过本次循环并继续下一次循环

[root@server1 ~]# ./for_test.sh
1
3
5
9
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for i in `seq 1 2 10`
do
  if [ $i -eq 7 ]
    then
      continue
  fi
  echo "$i"
done

continue [数字] 是一个 Shell 中的控制结构,当数字是2时,它的作用是在循环内部跳过本次循环并继续下一次循环,而且会跳过两层循环,即在两层循环内部执行。

[root@server1 ~]# ./for_test.sh
1
1
1
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for ((i=1;i<=3;i++))
do
  for ((j=1;j<=3;j++))
  do
    if [ $j -eq 2 ]
      then
        continue 2
    fi
    echo "$j"
  done
done
break跳出循环

break跳出循环:break直接结束此次循环,但是不影响外边嵌套的循环。

[root@server1 ~]# ./for_test.sh
1
2
1
2
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for ((i=1;i<=2;i++))
do
  for ((j=1;j<=4;j++))
  do
    if [ $j -eq 3 ]
      then
        break
    fi
    echo "$j"
  done
done

break [数字] 结束数字中的几次循环

[root@server1 ~]# ./for_test.sh
1
2
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for ((i=1;i<=2;i++))
do
  for ((j=1;j<=4;j++))
  do
    if [ $j -eq 3 ]
      then
        break 2
    fi
    echo "$j"
  done
done

echo相关的常用转义字符

echo -n 表示不换行输出。

[root@server1 ~]# ./for_test.sh
123123[root@server1 ~]# cat for_test.sh
#!/bin/bash
for ((i=1;i<=2;i++))
do
  for ((j=1;j<=3;j++))
  do
    echo -n "$j"
  done
done

echo -e 输出转义字符,将转义后的内容输出到屏幕上, 只有加了-e才能执行下面的转义符。

常用转义符:

\b转义后是一个退格符(Backspace),用于将光标向前移动一个位置,但不删除该位置上的字符。不过,当输出到终端时,实际的效果可能会受到终端如何处理退格符的影响。

[root@server1 ~]# echo -e "1234a"
1234a
[root@server1 ~]# echo -e "1234\ba"
123a
[root@server1 ~]# echo -e "1234\b\ba"
12a4

\c 转义后表示不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。

[root@server1 ~]# echo -e "1234\c"
1234[root@server1 ~]#
[root@server1 ~]# echo -e "12\c34"
12[root@server1 ~]#

\n 转义后表示换行,被输出的字符从"\n"处开始另起一行。

[root@server1 ~]# echo -e "12\n34"
12
34

\f 转义后是一个表单馈送符(Form Feed),通常用于在打印输出中将纸张向前移动到下一页的开始,或者在终端中,它通常用于清除屏幕并移动光标到屏幕的左上角(尽管这个行为可能会根据终端的不同而有所差异)。

\v 转义后是一个垂直制表符(Vertical Tab),它在输出中通常用于在垂直方向上移动光标到下一个制表位置。

[root@server1 ~]# echo -e "1234\v1234"
1234
    1234

\t 转以后表示插入tab,即横向制表符(tab)。

[root@server1 ~]# echo -e "1234\t1234"
1234    1234

\r 转以后表示光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖

[root@server1 ~]# echo -e "1234\rabcd"
abcd
[root@server1 ~]# echo -e "1234\rab"
ab34

使用for循环和echo相关的常用转义字符打印一张出九九乘法表

1.打印一个9*9的正方形队列

[root@server1 ~]# ./99_test.sh
*********
*********
*********
*********
*********
*********
*********
*********
*********
[root@server1 ~]# cat 99_test.sh
#!/bin/bash
for ((i=1;i<=9;i++))
do
  for ((j=1;j<=9;j++))
  do
    echo -n "*"
  done
echo #用于换行
done

2.砍半

[root@server1 ~]# ./99_test.sh
*
**
***
****
*****
******
*******
********
*********
[root@server1 ~]# cat 99_test.sh
#!/bin/bash
for ((i=1;i<=9;i++))
do
  for ((j=1;j<=i;j++))
  do
    echo -n "*"
  done
echo #用于换行
done

3.填入内容

[root@server1 ~]# ./99_test.sh
1*1=1
1*2=22*2=4
1*3=32*3=63*3=9
1*4=42*4=83*4=124*4=16
1*5=52*5=103*5=154*5=205*5=25
1*6=62*6=123*6=184*6=245*6=306*6=36
1*7=72*7=143*7=214*7=285*7=356*7=427*7=49
1*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=64
1*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81
[root@server1 ~]# cat 99_test.sh
#!/bin/bash
for ((i=1;i<=9;i++))
do
  for ((j=1;j<=i;j++))
  do
    echo -n "$j*$i=$(($j*$i))"
  done
echo #用于换行
done

4.调整格式

[root@server1 ~]# ./99_test.sh
1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
1*4=4   2*4=8   3*4=12  4*4=16
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81
[root@server1 ~]# cat 99_test.sh
#!/bin/bash
for ((i=1;i<=9;i++))
do
  for ((j=1;j<=i;j++))
  do
    echo -ne "$j*$i=$(($j*$i))\t"
  done
echo #用于换行
done

完成。

相关推荐
2202_754421546 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
red_redemption21 分钟前
自由学习记录(23)
学习·unity·lua·ab包
努力的悟空32 分钟前
国土变更调查拓扑错误自动化修复工具的研究
运维·自动化
幽兰的天空1 小时前
默语博主的推荐:探索技术世界的旅程
学习·程序人生·生活·美食·交友·美女·帅哥
运维&陈同学1 小时前
【zookeeper03】消息队列与微服务之zookeeper集群部署
linux·微服务·zookeeper·云原生·消息队列·云计算·java-zookeeper
沐泽Mu1 小时前
嵌入式学习-C嘎嘎-Day05
开发语言·c++·学习
你可以叫我仔哥呀2 小时前
ElasticSearch学习笔记三:基础操作(一)
笔记·学习·elasticsearch
周末不下雨2 小时前
win11+ubuntu22.04双系统 | 联想 24 y7000p | ubuntu 22.04 | 把ubuntu系统装到1T的移动固态硬盘上!!!
linux·运维·ubuntu
脸ル粉嘟嘟2 小时前
GitLab使用操作v1.0
学习·gitlab
路有瑶台2 小时前
MySQL数据库学习(持续更新ing)
数据库·学习·mysql