目录
一、相关介绍
1. echo
echo用于标准输出以及显示文本内容,单独使用默认进行空行,需要加选项-a取消换行。当使用-e选项时,表示使用转义符。常用转义符如下:
选项 | 作用 |
---|---|
\r | 光标移至行首,并且不换行 |
\s | 当前shell的名称,如bash |
\t | 插入Tab键,制表符 |
\n | 输出换行 |
\f | 换行,但光标仍停留在原处 |
\ | 表示插入"\"本身转义 |
\b | 表示退格 不显示前一个字符 |
\c | 抑制更多的输出或不换行 |
示例:
[root@localhost ~]# echo -e "123\b456"
12456
#退格删除前面的字符,注意退格次数不能大于前面字符数
[root@localhost ~]# echo -e "\c"
[root@localhost ~]#
#默认echo会换行,这里不换行
注意:
echo只能做一次运算,无法进行多次运算,需要用eval命令协助运算。
[root@localhost ~]# a=3;echo {1..$a}
{1..3}
[root@localhost ~]# a=3;eval echo {1..$a}
1 2 3
2. date
date查看当前系统时间
- -d:你描述的日期,显示指定字符串所描述的时间,而非当前时间
- %F:完整日期格式,等价于 %Y-%m-%d
- %T:时间(24小时制)(hh:mm:ss)
[root@localhost ~]# date +%F-%T
2024-01-25-15:21:54
[root@localhost ~]# cal #查看日历
一月 2024
日 一 二 三 四 五 六
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
3. seq
用于打印整数序列
[root@localhost ~]# echo {1..10..2} #从1开始,步长为2,到10为止(奇数)
1 3 5 7 9
[root@localhost ~]# seq 1 2 10
1
3
5
7
9
4. 循环含义
将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件。
重复运行次数:
- 循环次数事先已知,使用for
- 循环次数事先未知,使用while和until
二、for循环
for
循环是Linux中常用的循环结构,用于遍历列表、文件中的行或进行数值迭代。需要注意的是,for
循环是按顺序遍历列表中的元素,对于数组,可以使用[@]
来表示所有元素,也可以使用[*]
表示所有元素。在处理包含空格等特殊字符的元素时,最好使用双引号将变量括起来。
语法结构:
- 列表循环
- 不带列表循环
- 类C风格的for循环
1. 列表循环
语法:
for 变量名 in {取值列表}
do
command #循环体,执行操作
done
一般用法:
for i in {1..50..2} #1-50的奇数
for i in {2..50..2} #1-50的偶数
for i in {10..1} #1-10倒序排列
for i in $(seq 10) #1-10正序排列
for i in $(seq 10 -1 1) #1-10倒序排列
for i in $(seq 1 2 10) #1-10的奇数,中间为步长
2. 不带列表循环
语法:
for 变量名
do
command
done
示例:
#!/bin/bash
for i
do
echo hello
done
[root@localhost ~]# bash 1.sh 123 #把123赋值给变量i,i有值了它就开始执行do..done了
hello
3. 类C语言风格for循环
语法:
for ((expr1;expr2;expr3))
do
command
done
expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出
示例:
#!/bin/bash
for(( i=0;i<=5;i++)) #定义for循环i变量初始值为0,循环条件i小于等于5,每循环一次i自加1
do
echo "$i" #for循环每循环一次执行一次输出$i
done #for语句结束标志
[root@localhost data]# bash 1.sh
0
1
2
3
4
5
4. for循环应用示例
示例1:通过用户列表文件创建用户
[root@localhost data]# cat user.txt
zhangs
lis
wangw
[root@localhost data]# vim 1.txt
#!/bin/bash
for i in `cat /data/user.txt`
do
id $i &> /dev/null
if [ $? -eq 0 ];then
echo "${i}用户已存在"
else
useradd ${i}
echo 123 | passwd --stdin $i &> /dev/null
echo "${i}用户已创建"
fi
done
[root@localhost data]# bash 1.sh
zhangs用户已创建
lis用户已创建
wangw用户已创建
示例2:ping网段检查主机连通性
[root@localhost ~]# vim ping.sh
#!/bin/bash
#name=ping
for i in {1..254}
do
{
ping -c1 -w2 192.168.190.${i} &> /dev/null && echo "192.168.190."$i" up" >> /data/up || echo "192.168.190."$i" down" >> /data/down
} &
done
#for循环,变量i取值1到254.向192.168.1.1~254各ping一个包,超时两秒,不论命令是否正确输出到垃圾箱;如果ping通将内容追加/data/up文件中;如果ping不通将内容追加/data/down文件中;整个过程后台运行。
示例3:批量修改文件后缀名
[root@localhost data]# touch {1..5}.doc
[root@localhost data]# ls
1.doc 2.doc 3.doc 4.doc 5.doc
[root@localhost ~]# vim 1.sh
#!/bin/bash
for i in `ls /data`
do
a=`echo $i | cut -d"." -f1`
mv /data/$i /data/$a.txt
done
[root@localhost data]# ls
1.txt 2.txt 3.txt 4.txt 5.txt
示例4:制作乘法口诀表
#!/bin/bash
# x行数 y列数
for x in {1..9}
do
for y in `seq $x`
do
echo -e "${y}x${x}=$[x*y] \t\c"
done
echo
done
[root@localhost data]# bash cf.sh
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
三、while循环
1. 基本介绍
while
循环用于在满足某个条件的情况下,重复执行一系列命令或操作。while
循环会在每次循环开始之前检查条件是否为真,只要条件为真,循环就会继续执行,直到条件为假。
语法:
while [条件]
do
# 要执行的命令
done
#[条件]:这是确定循环是否应继续的条件。它可以是任何有效的 shell 表达式或返回真或假值的命令。只要该条件计算结果为真,循环就会继续执行
#do:标记循环块的开始位置,在此处定义要执行的命令
#要执行的命令:这些是将重复执行的命令,只要条件为真
#done:标记循环块的结束位置
示例:使用while
循环打印从1到5的数字
num=1
while [ $num -le 5 ] #检查变量num的值是否小于或等于5
do
echo $num
num=$((num + 1)) #打印当前的num值,并将num递增1
done
2. 死循环
① while [ 1 -eq 1 ] 判断条件一直为真,一直执行do内命令
② while true 直接写true
③ while : 判断条件为冒号也表示死循环
3. 双重循环及跳出循环
break跳出单个循环 break n数字,数字代表跳出n层循环
continue终止某次循环中的命令,但是不会完全终止命令
exit 直接退出脚本
示例1:结束某次循环
#!/bin/bash
for j in {1..2}
do
for i in {1..5}
do
if [ $i -eq 3 ];then
continue #continue终止某次循环中的命令,但是不会完全终止命令
fi
echo i=$i
done
echo "--------------------------------------"
done
[root@localhost data]# bash 1.sh
i=1
i=2
i=4
i=5
--------------------------------------
i=1
i=2
i=4
i=5
--------------------------------------
示例2:结束多层循环
#!/bin/bash
for j in {1..2}
do
for i in {1..5}
do
if [ $i -eq 3 ];then
break #break默认为1,结束一层循环
fi
echo i=$i
done
echo "--------------------------------------"
done
[root@localhost data]# bash 1.sh
i=1
i=2
--------------------------------------
i=1
i=2
--------------------------------------
[root@localhost data]# bash 1.sh #break 2,代表跳出两层循环
i=1
i=2
4. while循环应用示例
示例1:批量添加用户,用户名称以stu开头,按数字顺序编号,一共添加20个用户,初始密码均为123456
#!/bin/bash
u=1
while [ $u -le 20 ]
do
useradd stu$u
echo 123456 | passwd --stdin stu$u &> /dev/null
let u++
done
[root@localhost data]# bash u.sh
[root@localhost data]# tail /etc/passwd
stu11:x:1018:1018::/home/stu11:/bin/bash
stu12:x:1019:1019::/home/stu12:/bin/bash
stu13:x:1020:1020::/home/stu13:/bin/bash
stu14:x:1021:1021::/home/stu14:/bin/bash
stu15:x:1022:1022::/home/stu15:/bin/bash
stu16:x:1023:1023::/home/stu16:/bin/bash
stu17:x:1024:1024::/home/stu17:/bin/bash
stu18:x:1025:1025::/home/stu18:/bin/bash
stu19:x:1026:1026::/home/stu19:/bin/bash
stu20:x:1027:1027::/home/stu20:/bin/bash
示例2:猜商品价格
#!/bin/bash
n=`echo $[RANDOM%1000+1]`
time=0
while true
do
read -p "请输入商品的价格(1-1000):" m
let time++
if [ $n -eq $m ];then
echo "猜中了,商品价格是${m};猜了${time}次"
exit
elif [ $n -gt $m -a $m -le 1000 -a $m -gt 0 ];then
echo "价格过低"
elif [ $n -lt $m ] && [ $m -le 1000 ];then
echo "价格过高"
else
echo "输入有误,重新输入"
fi
done
[root@localhost data]# bash c.sh
请输入商品的价格(1-1000):0
输入有误,重新输入
请输入商品的价格(1-1000):500
价格过高
请输入商品的价格(1-1000):250
价格过高
请输入商品的价格(1-1000):100
价格过低
请输入商品的价格(1-1000):150
价格过高
请输入商品的价格(1-1000):125
价格过高
请输入商品的价格(1-1000):115
猜中了,商品价格是115;猜了7次
四、until循环
1. 基本介绍
until
循环是一种用于执行命令直到指定条件为真时停止的循环结构,只要条件为假,do
和done
之间的代码块就会一直执行,until
循环通常用于需要在条件变为真之前重复执行一段代码的情况。
语法:
until 条件测试
do
循环体 #在条件为假时执行的命令
done
2. 示例
计算1-100的和
#!/bin/bash
sum=0
i=1
until [ $i -gt 100 ] #当小于100时执行循环
do
let sum=$i+$sum
let i++
done
echo sum=$sum
[root@localhost data]# bash 1.sh
sum=5050