什么是shell:
在Linux内核与用户之间的解释器程序,通常指 /bin/bash,**负责向内核翻译及传达用户/程序指令**,相当于操作系统的“外壳”。采用非交互式命令。
解释器分类:
Bash的优点 :
tab键、历史命令、快捷键、支持别名、管道、重定向。
脚本的编写规范
1, 在第一行声明解释器(使用哪种解释器)
#!/bin/bash
2,在第二行描述具体内容,内容可以是脚本的功能、作用等介绍(或者是步骤、思路、用途、变量含义等)
#这是一个测试脚本
脚本的执行方式
1, 使用路径指向一个具有x权限的文件
#chmod a+x test01.sh
# ./test01.sh
2, 使用解释器,无需x权限,新开启解释器子进程
[root@svr7 opt]# bash test01.sh
3, 使用source命令,无需x权限,不会开启解释器子进程,而使用默认解释器进程
[root@svr7 opt]# source test01.sh
4,bash 与 source 执行进程的区别:
bash执行时看不到进入abc的效果,因为bash开启了子进程,执行完任务就退出了子进程,父进程并没有进入abc目录,如果使用source执行该脚本就可以看到进入abc目录的效果,因为是父进程亲自进入没有开启子进程。
减少输出信息:
编写部署ftp的脚本,要求是开启服务的状态,并且开机自启
#!/bin/bash
#部署ftp服务
yum -y install vsftpd &> /dev/null #将输出信息输出到垃圾桶中,即不打印输出信息。
systemctl restart vsftpd
systemctl enable vsftpd
常量 固定不变的内容
变量 以固定名称存放,可能会变化的值
提高脚本对任务需求、运行环境变化的适应能力。方便在脚本中重复使用。
变量的种类:
1, 自定义变量,定义名称时可以用数字、大小写字母,下划线,不允许使用数字开头,不允许使用特殊字符
变量名称=变量的值
[root@localhost opt]# a=10 定义变量(赋值)
[root@localhost opt]# echo $a 调用变量
[root@localhost opt]# unset a 取消变量的定义
echo ${a}RMB 容易发生混淆的情况使用大括号
2,环境变量,由系统提前定义好,使用时直接调用,无需用户定义
USER当前用户名 HOME当前用户的家目录
UID当前用户的id号 SHELL当前用户的解释器
PWD当前位置 PATH 存储了执行指令的路径
PS1 一级提示符 PS2 二级提示符
3 预定义变量与位置变量 $* $# $$ $? $1 $2 $3 …..
#!/bin/bash
#测试预定义变量和位置变量
echo $1 执行脚本名称后面的第1个位置参数 a
echo $2 执行脚本名称后面的第2个位置参数 b
echo $3 执行脚本名称后面的第3个位置参数 c
echo $* 所有的位置参数 a b c d
echo $# 所有的位置参数的个数 4
echo $$ 随机的进程号 6403
echo $? 判断上一条指令是否执行成功,0是成功,非0是失败 0
#bash test.sh a b c d
变量的扩展知识:
单引号 界定范围 可以屏蔽特殊符号 :
#Touch ‘a b’ 可以创建a空格b的文件
#a=10
#echo ‘ $ a’ : $ 是调用变量的特殊符号,echo '$a' 屏蔽了 $ 在Linux中的功能, $ 符被认为是一个字符,输出结果位 $a
双引号 界定范围:
Touch “a b” 也可以创建a空格b的文件
echo “$a” 可以调用变量
` `反撇号 获取指令的执行结果 ,或者使用$()
#a=date 定义变量时如果使用命令则不会直接识别
#a=`date` 使用反撇号可以将命令的执行结果赋值给变量
#a=$(date) 效果同上
使用read指令,将脚本变成交互式,使脚本可以从用户那里得到信息:
用法:read -p “提示的信息” 变量名
#!/bin/bash
read -p "请输入用户名:" u
useradd $u
read -p "请输入密码:" p
echo $p | passwd --stdin $u
stty -echo 屏蔽回显, stty echo 恢复回显
#!/bin/bash
read -p "请输入用户名:" u
useradd $u
stty -echo
read -p "请输入密码:" p
stty echo
echo "$p" | passwd --stdin $u
export 定义全局变量,可以让子进程使用父进程定义的变量
export b=20 创建变量b的同时发布为全局效果
export a 将已有的变量发布为全局效果
export -n a 取消变量的全局效果
env 查看所有环境变量
set 查看所有变量
shell中的运算:
1, 使用expr工具
expr 可以计算并输出,运算符号两边要有空格
expr 3 – 1 减法
expr 2 + 2 加法
expr 2 '*' 2 乘法,*号在Linux中是通配符的意思,单引号将*的功能屏蔽掉了,*就有的它原本的功能了,乘法
expr 2 \* 2 使用乘法时,这里使用\代表转义符号,可以屏蔽之后1个字符的特殊效果
expr 4 / 2 除法
expr 10 % 3 取余数
2,方法二用$[ ]结构,配合echo输出,同样可以实现加 减 乘 除 取余
echo $[1+1]
echo $[2-1]
echo $[2*2]
echo $[4/2]
echo $[5%3]
3 , 使用bc 计算器,可以进行小数运算
echo "1.1+1" | bc //非交互的方式使用bc工具
echo "10/3" | bc
echo "scale=3;10/3" | bc //scale可以定义小数点后面的长度
4, 使用let指令,不输出计算结果,专用于创建变量,或者对变量进行自增减
let a++ 变量的自增减,将变量a的值加1
let a-- 变量a减1
let a+=2 变量a加2
let a-=2 变量a减2
let a*=10 变量a乘以10
条件测试: 可以为脚本提供智能判断的效果
使用方式: test 表达式 或者 [ 表达式 ]
条件测试种类:
1, 对字符串进行判断
可以使用的方式有: == 两边是否相等 ; != 两边是否不等
[ a == a ] 判断字符串a是否等于a,如果相等,返回值就是0
[ root == $USER ] 判断当前用户名是否叫root,如果是,返回值就是0
[ root != $USER ] 判断当前用户名是否不叫root,如果不叫root,返回值就是0
-z : 判空
[ -z $a ] 判断变量a是否为空,如果是,返回值是0
[ ! -z $a ] 判断变量a是否非空,如果是,返回值是0
2,逻辑符号
&& 之前任务执行成功才执行之后任务
|| 之前任务执行失败才执行之后任务
[ root == $USER ] || exit 如果当前用户不是管理员,则退出
ls || ls 只执行第1个ls
ls && ls 两个ls都执行
ls || ls && ls 第一个ls成功,第二个ls没成功,第三个看的是第一个和第二个的组合,输出了ls,所以是成功的,所以第三个ls输出
练习
编写脚本安装ftp服务,但如果是非管理员执行该脚本则给出非管理员的提示并退出:
#!/bin/bash
#测试|| && 符号
[ root != $USER ] && echo "你不是管理员" && exit
yum -y install vsftpd
systemctl restart vsftpd
systemctl enable vsftpd
3,数字的条件测试
-eq是否相等 -ne是否不等 -gt大于 -ge大于等于 -lt小于 -le小于等于
[ 1 -eq 1 ] 判断1是否等于1,判断成功的话返回值是0,判断失败返回值是非0
a=10
b=20
[ $a -eq $b ] && echo "ok" || echo "no" 判断变量a是否等于b ,是的话显示ok,否显示no
[ $a -gt $b ] && echo "ok" || echo "no" 判断变量a是否大于b ,是的话显示ok,否显示no
4,对文件进行条件测试
-e是否存在不关心文件类型
-f是否存在且是普通文件
-d是否存在且是目录
-r判断当前用户对文件是否能读 ,对root无效
-w判断当前用户对文件是否能写 ,对root无效
-x 执行(文件),进入(目录)
[ -e a ] 当前位置如果有a文件,不关心类型,则测试成功
[ -f a ] 当前位置如果有叫a的普通文件,则测试成功
[ -d a ] 当前位置如果有叫a的目录,则测试成功
[ -r a ] 当前用户如果对a文件有读权限,则测试成功
[ -w a ] 当前用户如果对a文件有写权限,则测试成功
[ -x a ] 当前用户如果对a文件有执行(目录是进入)权限,则测试成功