shell脚本

shell 脚本(script):
shell 脚本文件:是一种linux操作命令的集合文件。用户运行脚本文件时就会自动执行文件中的命令。

入门级(初级)脚本:脚本文件中仅包含一些操作命令,无任何逻辑判断语句。这种脚本只会按从上到下的顺序来执行命令,如果某行命令错误会自动跳过。

高级脚本:在入门级脚本的基础上加入条件判断if、循环(for、while、until)等逻辑控制语句,让脚本更具有通用性和可移植性。

shell脚本的运行的过程:调用脚本文件中的命令--〉shell命令解释器--〉kernel内核--〉hardware硬件

高级语言的程序运行过程:二进制程序文件--〉kernel内核--〉hardware硬件

实例:编写一个入门级的脚本文件01.sh,要实现的功能是执行clear

第一步,编写01.sh脚本文件

#!/bin/bash
#date:2019-02-18
#Author By : jim
#Decription: this is my first shell script.
clear
echo QQ:2364729138
cd
ls
pwd
sleep 5s
date
lsblk

chmod -v +x /sh/01.sh
. /sh/01.sh 或 source /sh/01.sh 或 /sh/01.sh 或 sh /sh/01.sh 或 bash /sh/01.sh

运行脚本并显示脚本的执行过程:sh -x /sh/01.sh

技巧:
shell脚本学习的帮助文档:man bash

 test  条件  语句  或  [  条件  ]

功能:用来判断文件、权限、值(数值是否相等、是否为空)。
帮助手册:man test

test练习:

项目一:字符串的长度、值的判断测试。
练习:判断字符串长度为0则为真(true,状态码为0)
[root@node11 ~]# x=''
[root@node11 ~]# test -z $x
[root@node11 ~]# echo $?
0

练习:判断字符串长度不为0则为真(true,状态码为0)
[root@node11 ~]# x=1234
[root@node11 ~]# test -n $x
[root@node11 ~]# echo $?
0

练习:判断字符串内容相等为真(true,状态码为0)
[root@node11 ~]# test abc = abc
[root@node11 ~]# echo $?
0
[root@node11 ~]# test abc = abcde
[root@node11 ~]# echo $?
1

练习:判断字符串内容不相等为真(true,状态码为0)
[root@node11 ~]# test abc != abcde
[root@node11 ~]# echo $?
0

项目二:整数值的大小(相等eq、不相等ne、大于gt、小于lt、大于或等于ge、小于或等于le)判断测试。
练习:执行如下操作,熟悉整数值的大小判断测试。
x=1314
y=520
z=520
test $x -eq $y
echo $?
test $z -eq $y
echo $?
test $x -ne $y
echo $?
test $x -gt $y
echo $?
test $x -lt $y
echo $?
test $z -lt $x 520 < 1314
echo $?
test $x -ge $y 1314 >= 520
echo $?
test $z -ge $y 520 >= 520
echo $?
test $y -le $x 520 <= 1314
echo $?
test $y -le $z 520 <= 520
echo $?

项目三:文件类型(目录d、普通文件-、字符设备c、块设备b、软链接l、管道p、套接字s)、文件大小(大小为0、不为0)、文件的新旧、权限(ugo、rwx、facl、3种s权限等)的判断测试。
[ -d /etc ]
echo $?

[ -f /etc/hosts ]
echo $?

[ -c /dev/tty ]
echo $?

[ -b /dev/sda ]
echo $?

[ -L /etc/rc.local ]
echo $?

find / -type p 在根目录及其子目录中查找类型为管道的文件
[ -p /run/dmeventd-client ]
echo $?

find / -type s
[ -S /run/systemd/notify ]
echo $?

文件权限:判断当前用户对文件是否有可读、可写、可执行权限。
useradd ak
su - ak
pwd
touch a1
chmod -v 0 a1
[ -r a1 ] ; echo $?
chmod -v u+r a1
[ -r a1 ] ; echo $?
[ -w a1 ] ; echo $?
[ -x a1 ] ; echo $?
touch a2
[ -t 1 ] ; echo $? 文件描述符(FD,文件在内存中的数字代号)已在终端打开了
[ -t 168 ] ; echo $?

exit

复合条件判断测试:逻辑非、逻辑与、逻辑或
[ ! abc = abcde ] ; echo $? 逻辑非
[ abc = abc -a 123 -eq 123 ] ; echo $? 逻辑与,同时满足两个条件就为真(状态码为0)
[ abc = abcd -o 123 -eq 123 ] ; echo $? 逻辑或,满足其中一个条件就为真(状态码为0)


if条件语句:
3种结构:

if结构1:单条件,单分支。如果满足if后面的条件1(即条件的结果状态码为真[即为0]),就执行then后面的语句。
if 条件1;then
command命令1
command命令2
fi

if语句的简写如下(命令的逻辑与执行):
命令1 && 命令2 等同于 if 条件1;then 命令列表;fi

例如:用if的结构1做如下测试。
x=abc;y=abc;z=123
if [ $x = $y ];then
echo yes
fi

if语句的简写如下:
[ $x = $y ] && echo yes

例如:判断系统中是否存在root用户,如果存在就提示yes。
用命令的逻辑执行来实现,方法如下:
id root && echo yes

用if语句来实现,写法如下:
id root
if [ $? -eq 0 ];then
echo yes
fi

if结构2:单条件,双分支。如果满足if后面的条件1(即条件的结果状态码为真[即为0]),就执行then后面的语句,否则执行else后面的语句。
if 条件1;then
command命令1
command命令2
else
command命令3
command命令4
fi

if双分支的简写:
命令1 && 命令2 || 命令3
解释:命令1执行成功(状态码为0),就执行命令2,否则执行命令3.

例如:用if的结构2做如下测试。
x=abc;y=abc;z=123
if [ $x = $y ];then
echo yes
else
echo no
fi

if语句的简写如下:
[ $x = $y ] && echo yes || echo no

例如:判断系统中是否存在/zk目录,如果存在就删除此目录且显示过程,否则创建此目录且显示过程
方法一:用命令的逻辑执行方法来实现的写法。
[ -d /zk ] && rm -rfv /zk || mkdir -pv /zk

方法二:用if语句实现的写法。
if [ -d /zk ];then
rm -rfv /zk
else
mkdir -pv /zk
fi

例如:判断系统中是否存在zk用户,如果存在就用userdel -r zk删除此用户,否则创建zk用户。
方法一:用命令的逻辑执行方法来实现的写法。
id zk && userdel -r zk || useradd zk

方法二:用if语句实现的写法。
if id zk;then
userdel -r zk
else
useradd zk
fi

if结构3:多条件,双分支。如果满足if后面的条件1(即条件的结果状态码为真[即为0]),就执行then后面的语句;否则测试elif后的条件2,满足条件2就执行elif的then后面的语句;否则执行else后面的语句。
if 条件1;then
command命令1
command命令2
elif 条件2;then
command命令3
command命令4
else
command命令5
command命令6
fi

例如:用if的结构3做如下测试。做猜数字游戏。
x=123
if [ $x -eq 123 ];then
echo 'you are right.'
elif [ $x -gt 123 ];then
echo 'you are bigger'
else
echo 'you are little.'
fi

例如:写一个名称为/sh/cai.sh的脚本,要求提示用户输入数字,判断数字大小是否为520,如果是就提示yes;如果大于520,就提示bigger;否则提示little。
第1步,编写/sh/cai.sh脚本文件。
mkdir -pv /sh
vim /sh/cai.sh
#!/bin/bash
#description:this is crossword games.
read -p 'Please input your number:' x
if [ $x -eq 123 ];then
echo 'you are right.'
elif [ $x -gt 123 ];then
echo 'you are bigger'
else
echo 'you are little.'
fi

第2步,添加x可执行权限,测试脚本的运行。
chmod -v +x /sh/cai.sh
. /sh/cai.sh

nfs软件的自动安装部署
1.提示用户输入共享目录路径。
2.判断共享目录是否已存在,如果存在就提示dir exsits,否则创建目录。
3.判断exports文件中是否已存在目录的共享设置,如果存在就提示,否则在exports文件中以可读可写方式共享此目录。
shell脚本

例:执行如下操作,理解单引号、双引号的区别。
shell脚本
说明:echo 的-e 选项是允许识别\n换行符、\t tab键、\r回车符特殊字符。

说明:${x}通常等同于$x,那么什么时候需要将变量名用{}大括号括起来呢?
答:当变量名后面紧贴着其他字符时,为了避免歧义,就需要将变量名用{}大括号括起来。

shell脚本
可以明确看到有没有引号的区别

if语法:
单分支结构
if 条件测试
then
命令
fi

双分支结构
if 条件测试
then
命令
else
命令
fi

多分支结构
if 条件测试1
then
命令1
elif 条件测试2
then
命令2
else
命令
fi

if 条件测试1
then
命令1
elif 条件测试2
then
命令2
elif 条件测试3
then
命令3
elif 条件测试4
then
命令4
else
命令
fi

if 条件测试;then
命令
else
命令
fi

if 条件测试1;then
命令1
elif 条件测试2;then
命令2
else
命令
fi

yum 源的一键配置
shell脚本

从1加到100的脚本

shell脚本

输出3角行,乘法口诀

shell脚本

猜字游戏
while是当条件为真退出循环
until是直到满足条件退出循环
while和until
shell脚本

删除用户

shell脚本

一键部署脚本
shell脚本
脚本创文件

shell脚本
创建用户和密码

shell脚本

dns一键部署

shell脚本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章