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

完成。

相关推荐
北京迅为几秒前
【北京迅为】iTOP-4412精英版使用手册-第三十五章 WEB控制LED
linux·嵌入式硬件·嵌入式·4412
让我们一起加油好吗15 分钟前
【C++】封装红黑树模拟实现 set 和 map
linux·c++·set·map·红黑树
暴富奥利奥30 分钟前
完成docker方式的ros环境配置
linux·学习·docker·容器
秃头菜狗32 分钟前
十四、运行经典案例 wordcount
大数据·linux·hadoop
ManageEngineITSM43 分钟前
IT 服务自动化的时代:让效率与体验共进
运维·数据库·人工智能·自动化·itsm·工单系统
总有刁民想爱朕ha1 小时前
AI大模型学习(17)python-flask AI大模型和图片处理工具的从一张图到多平台适配的简单方法
人工智能·python·学习·电商图片处理
QotomPC1 小时前
软件定义的理想硬件平台:Qotom Q30900SE/UE系列在AIO服务器与边缘网关中的实践
运维·服务器
望获linux1 小时前
【实时Linux实战系列】实时系统的可观测性:Prometheus 与 Grafana 集成
大数据·linux·服务器·开发语言·网络·操作系统
捷智算云服务1 小时前
H200服务器维修服务体系构建:捷智算的全链条保障方案
运维·服务器
hweiyu001 小时前
Linux 命令:mount
linux·运维·服务器