shell编程之循环语句与函数

一 echo命令

echo -n 表示不换行输出

echo -e 表示输出转义符

常用的转义符

二 date

date查看当前系统时间

-d 你描述的日期,显示指定字符串所描述的时间,而非当前时间

%F 完整日期格式,等价于 %Y-%m-%d

% T 时间(24小时制)(hh:mm:ss)

root@localhost \~# date -d '-1 day' +%F

2021-10-21

root@localhost \~# date +%F

2021-08-19

root@localhost \~# date -d '1 day ' +%F-%T

2021-08-20-23:28:42

root@localhost mnt# date -d "-3 day" 前三天

2021年 08月 18日 星期三 11:30:15 CST

root@localhost mnt# date -d "+3 day" 后三天

2021年 08月 18日 星期三 11:30:15 CST

root@localhost data#date -d '1 day ' +%F' '%T

2021-10-22 00:45:37

三 日历

root@localhost data#cal 2021

#查看日历

root@localhost data#cal 9 1752

四 $RANDOM 取值范围:0-32767

root@test1 \~\]# echo $\[$RANDOM%50

37

root@test1 \~\]# echo $\[$RANDOM%20

15

五 seq

root@localhost data#seq 1 2 10 #从1 开始 步长为2 到10 为止

1

3

5

7

9

root@localhost data#seq 9 -1 1

9

8

7

6

5

4

3

2

1

六 循环的命令:for, while, until

1 for 列表循环

for 变量名 in {list}

do

command

done

2 不带列表循环

for 变量名

do

command

done

3 while

相对于for,需要知道循环次数

我们只知道停止条件,不知道次数,就需要使用while,直到达到条件

while循环 :1、语法结构 2、死循环

while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环

实验:1元才是正确答案

复制代码
[root@localhost ~]#cat mcb.sh
#!/bin/bash
p=`echo $[ RANDDM%1000+1 ]`
time=0

while true
do
let time++
read -p "请输入你猜测的价格 (1-1000):" h
if [ $h -eq $p ]
then
echo "恭喜你猜中了,你一共猜测了$time次"
exit
elif [ $h -gt $p ]
then
echo "你猜测的价格过高"
else
echo "你猜测的价格过低"
fi
done

4 双重循环及跳出循环

  • break跳出单个循环 break n 数字数字是几代表跳出n层循环

  • continue终止某次循环中的命令,但是不会完全终止命令

  • exit 直接退出脚本

5 until

until 循环与 while 循环类似,while 循环能实现的脚本 until 同样也可以实现,但区别是while 循环在条件为真是继续执行循环,而 until 则是在条件为假时执行循环

until 循环语句的语法结构如下所示

until 条件测试操作

do

命令序列

done

七 for-实验:①九九乘法表

复制代码
#!/bin/bash
# j行数   i管列数
for j in  {1..9}
do

        for i in  `seq  $j`
        do


        echo  -e   "${i}x${j}=$[i*j] \c"

        done

echo
done

另一种

复制代码
#!/bin/bash
for j in {1..9}
do
         for  i in `seq $j`
         do 
         echo  -ne  "$j*$i=$[ $j*$i ]\t"
         done
echo
done

实验②测试ping 通

复制代码
#!/bin/bash
for i in   {1..254}
do
{
ping -c2 -W2 192.168.11.$i  &>/dev/null  && echo "$i is online" >> data/hostonline.txt || echo "$i is offline" >> data/hostoffline.txt
} &
done

另一个

复制代码
[root@localhost ~]# cat mcb8.sh
#!/bin/bash
read -p  "请输入你需要测试的网段,格式为(192.168.11.):" ip 
for i in {1..254}
do
{
ping -c2 -W2 $ip$i  &>/dev/null
         if [ $? -eq 0  ]
         then
         echo "$ip$i is online"
         echo $ip$i >> host.txt
         else
         echo "$ip$i is offline"
         fi
}&
done
wait

实验③ 改变颜色

root@localhost data# echo -e "\E1;$\[RANDOM%7+31m 称霸武林 \E[0"

实验④ 求和

复制代码
#!/bin/bash
sum=0
for i  in  {1..100}
do
sum=$[sum+i] 
done
echo $sum

另一种方法

复制代码
#!/bin/bash
#by even 2018
sum=0
for i in `seq 1 100`
do
        sum=$[$i+$sum]
done
echo  $sum

另一种

复制代码
#!/bin/bash
#
i=100
a=1
until [ $i -le 1 ];do  #循环条件 i<=1
a=$(( $a + $i ))
i=$(( $i - 1 ))
done
echo $a

实验⑤改名字

复制代码
[root@localhost data]# cd /
[root@localhost /]# mkdir data
[root@localhost /]# bash mcb13.sh
bash: mcb13.sh: 没有那个文件或目录
[root@localhost /]# cd
[root@localhost ~]# cd data/
[root@localhost data]# mv mcb13.sh  /data
[root@localhost data]# cd /data/
[root@localhost data]# ls
mcb13.sh
[root@localhost data]# 
[root@localhost data]# ls
mcb13.sh



***************************

[root@localhost ~]# cd data/
[root@localhost data]# mv mcb13.sh  /data
[root@localhost data]# cd /data/
[root@localhost data]# ls
mcb13.sh


**********************************



[root@localhost data]# cat mcb13.sh
#!/bin/bash
for i in `cat /data/name.txt`
do
id $i
if [ $? -eq 0 ];then
echo "用户已存在"
else
useradd $i[root@localhost data]# cat name.txt
马传斌
马传斌2
马传斌3
ABCD
EFGihf
**************************


echo 123 | passwd  --stdin  $i
fi
done
***********************

[root@localhost data]# bash mcb13.sh
id: 马传斌: no such user
useradd:无效的用户名"马传斌"
passwd:未知的用户名 马传斌。
id: 马传斌2: no such user
useradd:无效的用户名"马传斌2"
passwd:未知的用户名 马传斌2。
id: 马传斌3: no such user
useradd:无效的用户名"马传斌3"
passwd:未知的用户名 马传斌3。
id: ABCD: no such user
更改用户 ABCD 的密码 。
passwd:所有的身份验证令牌已经成功更新。
id: EFGihf: no such user
更改用户 EFGihf 的密码 。
passwd:所有的身份验证令牌已经成功更新。
相关推荐
aixingkong9213 小时前
Nvidia为例 XPU的Multi-Host、Socket Direct 、GPUDirect、RDMA 技术点分析
服务器·网络·硬件架构·硬件工程
雯宝5 小时前
mnt_init 函数
linux
律宏阔11 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔11 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴11 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千11 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei3711 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei3711 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei3711 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh11 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker