shell脚本中的语句

for、while、if、case四大shell语句简单举例
三个脚本退出语句
Exit 结束脚本,整体退出
Break 允许跳出所有循环(终止执行后面的所有循环)
Continue 提前结束当前循环,进入下一个循环

为了更清楚的了解这几个的区别进行以下实验:
root@desktop26 mnt]# cat test1.sh
#!/bin/bash
for NUM in {1…5} //从1到4循环
do
if
[ "$NUM " -eq 3 ] //判断NUM是否等于3
then
$1 //这里输入脚本后输入的三个测试值
fi
echo $NUM
done
echo hello
[root@desktop26 mnt]# sh test1.sh exit //当NUM=3后直接全部退出脚本
1
2
[root@desktop26 mnt]# sh test1.sh continue //当NUM=3后,不执行后面的“echo NUM”,直接进入下次循环
1
2
4
5
hello
[root@desktop26 mnt]# sh test1.sh break //结束for的所有循环,进入下一步命令“echo hello”
1
2
hello
在这里插入图片描述
在这里插入图片描述
for语句
for做的是批处理
格式:
for (变量)in (取值)
do
done

{1…5}和seq 1 5的辨析
{1…5}是1到5循环,seq 1 5也是1到5循环,但不同的时seq可以设定步长 ,比如seq 1 2 6指的是从1到6每次增加两个数,而且seq 比”{}”更高级,其里面可以加变量名。但是“{}”内不可识别变量。
为了更清楚的比较,我们来看以下实验:
[root@desktop26 mnt]# cat test2.sh
#!/bin/bash
for NUM in {1…5} //{1…5}
do
echo $NUM
done
[root@desktop26 mnt]# sh test2.sh
1
2
3
4
5
[root@desktop26 mnt]# vim test2.sh
[root@desktop26 mnt]# cat test2.sh
#!/bin/bash
for NUM in seq 1 5
do
echo $NUM
done
[root@desktop26 mnt]# sh test2.sh
1
2
3
4
5
[root@desktop26 mnt]# vim test2.sh
[root@desktop26 mnt]# cat test2.sh
#!/bin/bash
for NUM in seq 1 2 5 //从1到5,步长为2,即1.3.5.
do
echo KaTeX parse error: Expected 'EOF', got '#' at position 32: …@desktop26 mnt]#̲ sh test2.sh …HOSTNUMBER &>/dev/null && {
echo -e “\033[32m 172.25.254.KaTeX parse error: Undefined control sequence: \0 at position 18: …STNUMBER is up;\̲0̲33[0m" } |…HOSTNUMBER is down;\033[0m”
} //ping通显示ip up ,否则显示 ip down,/033加的是输出的颜色值,此时需加-e识别。
done

[root@desktop mnt]# sh check_host.sh
172.25.254.1 is up;
172.25.254.2 is up;
172.25.254.3 is up;
172.25.254.4 is up;
172.25.254.5 is up;
172.25.254.6 is up;
172.25.254.7 is up;
172.25.254.8 is up;
172.25.254.9 is up;
172.25.254.10 is up;
172.25.254.11 is up;
172.25.254.12 is down;
172.25.254.13 is up;
172.25.254.14 is up;
172.25.254.15 is down;
172.25.254.16 is up;
172.25.254.17 is up;
172.25.254.18 is down;
172.25.254.19 is up;
172.25.254.20 is up;
172.25.254.21 is up;
172.25.254.22 is down;
172.25.254.23 is up;
172.25.254.24 is down;
172.25.254.25 is up;
172.25.254.26 is up;
172.25.254.27 is up;
172.25.254.28 is up;
172.25.254.29 is up;
172.25.254.30 is up;
172.25.254.31 is down;
172.25.254.32 is up;
172.25.254.33 is up;
172.25.254.34 is down;
172.25.254.35 is up;
172.25.254.36 is up;
172.25.254.37 is up;
172.25.254.38 is up;
172.25.254.39 is up;
172.25.254.40 is up;
172.25.254.41 is up;
172.25.254.42 is up;
172.25.254.43 is up;
172.25.254.44 is up;
172.25.254.45 is up;
172.25.254.46 is up;
172.25.254.47 is up;
172.25.254.48 is up;
172.25.254.49 is up;
172.25.254.50 is down;
在这里插入图片描述
在这里插入图片描述
实验二:建立一个数据库,利用脚本对所有数据库进行备份操作,每个数据库备份到一个文件中,并以.sql结尾,最后存储在到/mnt/mysql_dump目录下。
建立数据库:

Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.35-MariaDB MariaDB Server

Copyright © 2000, 2013, Oracle, Monty Program Ab and others.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

MariaDB [(none)]> create database linux;
Query OK, 1 row affected (0.10 sec)

MariaDB [(none)]> use linux
Database changed
MariaDB [linux]> create table linux_user(
-> username varchar(50) not null,
-> password varchar(50) not null);
Query OK, 0 rows affected (0.14 sec)

MariaDB [linux]> insert into linux_user values(“user1”,“123”);
Query OK, 1 row affected (0.11 sec)

MariaDB [linux]> insert into linux_user values(“user2”,“234”);
Query OK, 1 row affected (0.10 sec)

MariaDB [linux]> select * from linux_user;
±---------±---------+
| username | password |
±---------±---------+
| user1 | 123 |
| user2 | 234 |
±---------±---------+2 rows in set (0.00 sec)

MariaDB [linux]> quit
Bye
在这里插入图片描述
编写脚本如下
在这里插入图片描述
while语句
格式(当条件为真时执行do):
while true
do
done
实验一:编写脚本,实时监控根分区的使用情况,超过80%就给超级用户发送一封警告邮件
[root@localhost mnt]# vim warning.sh
#!/bin/bash
NUM=df -h | awk '/\/$/{print $5}' | awk -F "%" '{print $1}' //筛选出/使用情况百分比数字
while true
do
[ “$NUM” -ge 80 ] && {
echo “Your / will full !” | mail -s warning root
}
sleep 1 //每隔1秒执行一次
done
在这里插入图片描述
root@node1 mnt]# df //查看根分区使用情况
Filesystem Used Available Use% Mounted on
/dev/vda1 10473900 9488536 985364 29% /
devtmpfs 469344 0 469344 0% /dev
tmpfs 484932 84 484848 1% /dev/shm
tmpfs 484932 12784 472148 3% /run
tmpfs 484932 0 484932 0% /sys/fs/cgroup
/dev/mapper/vg0-vo 483670 2368 451811 1% /home
[root@node1 mnt]# sh test.sh & //执行脚本,并打入后台
[3] 4151
[root@node1 mnt]# mail //查看没有邮件
No mail for root
[root@node1 mnt]# dd if=/dev/zero of=/bigfile bs=1M count=6000//截取6000M的内存使根分区使用率变成80%以上
[root@node1 mnt]# df
Filesystem Used Available Use% Mounted on
/dev/vda1 10473900 9488536 985364 91% /
devtmpfs 469344 0 469344 0% /dev
tmpfs 484932 84 484848 1% /dev/shm
tmpfs 484932 12784 472148 3% /run
tmpfs 484932 0 484932 0% /sys/fs/cgroup
/dev/mapper/vg0-vo 483670 2368 451811 1% /home
[root@node1 mnt]# sh test.sh & //执行脚本并打入后台
[3] 4151
[root@node1 mnt]# mail //可以查到邮件
Heirloom Mail version 12.5 7/5/10. Type ? for help."/var/spool/mail/root": 23 messages 23 new

N 1 root Thu Jun 27 03:11 18/590 “warning”
N 2 root Thu Jun 27 03:11 18/590 “warning”
N 3 root Thu Jun 27 03:11 18/590 “warning”
N 4 root Thu Jun 27 03:11 18/590 “warning”

If语句
格式:
if
then
elif
then
、、、、、
else
fi
实验一:编写脚本,判断文件类型
#!/bin/bash
if
[ “$#” -ne “1” ]
then
echo " please input a file after script!!"

elif
[ ! -e “$1” ]
then
echo " $1 is not exist! "
elif
[ -b “$1” ]
then

echo " $1 is a block special!"

elif
[ -f “$1” ]
then

echo " $1 is a regular file!"

elif
[ -L “$1” ]
then

echo " $1 is a symbolic link! "

elif
[ -d “$1” ]
then

echo " $1 is a directory! "

else
echo unknow KaTeX parse error: Expected 'EOF', got '#' at position 239: …@localhost mnt]#̲ sh check_file.…#" -ne “2” ]//判断输入文件是否为两个
then

echo  -e "\033[31m please give me userfile and passfile after script !!\033[0m"   
exit 1

elif
[ ! -e “$1” ] //判断输入文件1是否为存在
then
echo -e "\033[31m $1 is not exist ! \033[0m "
exit 1
elif
[ ! -e “$2” ] //判断输入文件2是否为存在
then
echo -e “\033[31m $2 is not exist ! \033[0m "
exit 1
elif {
N1=awk 'BEGIN{N=0}{N++}END{print N}' $1 //判断输入文件1、2行数是否对应相等
N2=awk 'BEGIN{N=0}{N++}END{print N}' $2
[ “$N1” -ne " $N2” ]
}
then

echo -e "\033[31m $1's lines is not equal to $2's lines ! \033[0m "
exit 1

fi
#############################Create User#####################################
for LINES in seq 1 $N1
do

    USERNAME=`sed -n "${LINES}p" $1`
    PASSWORD=`sed -n "${LINES}p" $2`
    useradd $USERNAME
    [ "$?" -eq "0" ]      //建立用户返回值为真则建立成功,否则不建立
    echo $PASSWORD | passwd --stadin $USERNAME &> /dev/null && echo $USERNAME created !

done
在这里插入图片描述
[root@localhost mnt]# cat userfile
user1
user2
user3
[root@localhost mnt]# cat passfile
123
456
[root@localhost mnt]# sh user_create.sh userfile passfile //行数不相同
userfile’s lines is not equal to passfile’s lines !
[root@localhost mnt]# sh user_create.sh userfile
please give me userfile and passfile after script !! //为加文件
[root@localhost mnt]# vim passfile
[root@localhost mnt]# cat passfile //行数相同
123
789
456
[root@localhost mnt]# sh user_create.sh userfile passfile
[root@localhost mnt]# id user1
uid=1001(user1) gid=1001(user1) groups=1001(user1)
[root@localhost mnt]# id user2
uid=1002(user2) gid=1002(user2) groups=1002(user2)
[root@localhost mnt]# id user3
uid=1003(user3) gid=1003(user3) groups=1003(user3) //建立成功
[root@localhost mnt]# vim user_create.sh
[root@localhost mnt]# sh user_create.sh userfile passfile //用户已存在,不建立
useradd: user ‘user1’ already exists
useradd: user ‘user2’ already exists
useradd: user ‘user3’ already exists
在这里插入图片描述
case语句
格式:
case $1 in
dog) //第一种情况
echo cat
;;
cat) //第二种情况
echo dog
;;
*) //第三种情况
echo error
esac
测试if和case执行次数
[root@localhost mnt]# cat test.sh //for语句
#!/bin/bash
if
[ “$1” = “dog” ]
then

echo “cat!”
elif
[ “$1” = “cat” ]
then

echo “dog!”
else

echo “ERROR: please input “cat” or “dog” follow script !”
fi

[root@localhost mnt]# sh -x test.sh cat //执行两次

  • ‘[’ cat = dog ‘]’
  • ‘[’ cat = cat ‘]’
  • echo ‘dog!’
    dog!
    [root@localhost mnt]# sh -x test.sh dog //执行一次
  • ‘[’ dog = dog ‘]’
  • echo ‘cat!’
    cat!
    [root@localhost mnt]# cat text1.sh //case语句
    #!/bin/bash
    case $1 in
    dog)
    echo cat
    ;;
    cat)
    echo dog
    ;;
    *)
    echo error
    esac
    [root@localhost mnt]# sh -x text1.sh dog //执行一次
  • case $1 in
  • echo cat
    cat
    [root@localhost mnt]# sh -x text1.sh cat //执行一次
  • case $1 in
  • echo dog
    dog
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值