目录
(2)、编写脚本,安装网站服务并开启,浏览网站时显示"web-test~
终端显示控制stty -echo : 关闭终端输出(无显示)stty echo : 恢复终端输出(有显示)
一、shell概述
1、什么是shell
shell是在Linux内核与用户之间的解释器程序 : 通常指 /bin/bash
用户登陆之后 ---> 系统自动打开bash ---> ls、pwd、cat......
负责向内核翻译及传达用户/程序指令(Shell相当于翻译官,解释说明用户输入的命令给系统)相当于操作系统的“外壳”
2、shell使用方式:
交互式 —— 命令行
- 人工干预、智能化程度高
- 逐条解释执行、效率低
非交互式 —— 脚本
- 需要提前设计、智能化难度大
- 批量执行、效率高
- 方便在后台静悄悄地运行
3、解释器
[root@svr7 ~]# cat /etc/shells //查看所有解释器
/bin/sh #多数Unix默认的Shell
/bin/bash #多数Linux默认的Shell
/sbin/nologin #非登陆Shell
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
/bin/ksh
/bin/rksh
[root@svr7 ~]# sh //切换成sh解释器
sh-4.2# ls //利用sh解释器输入命令
sh-4.2#exit //退出sh解释器
[root@svr7 ~]#yum -y install ksh //安装新解释器
[root@svr7 ~]#ksh //进入新解释器
bash解释器的优点:
tab键、
快捷键、
历史命令、
支持别名、
管道、
重定向
二、编写及执行脚本
1、什么是shell脚本
shell脚本:提前写好可执行的语句,可以完成特定任务的文件按顺序、批量化执行
2、脚本创建三步走
(1)、新建文本文件 .sh后缀
(2)、添加可执行的脚本语句(命令行)
(3)、添加 x 执行权限
3、shell脚本编写规范
(1)、声明解释器 (可不写的,但不专业)
#!/bin/bash
(2)、编写注释
#可以描述脚本功能、变量作用等信息
(3)、执行指令
ls
cd
。。。
。。。
4、脚本的执行方式
(1)、为脚本添加x权限,使用相对或者绝对路径执行
chmod u+x test01.sh
./test01.sh 或者 /opt/test01.sh
相对路径 绝对路径
用户(root)---> bash ---> bash ---> echo
(2),使用解释器程序执行脚本,无需x权限
bash test01.sh(相对路径)
用户(root)---> bash(父) ---> bash(子)---> echo 会开启子进程
注:父bash 开启一个子进程bash 去执行脚本,子进程bash执行完事儿之后就会自动退出了,就会发返回父进程所在的(位置)状态
(3),使用source命令执行脚本,无需x权限
source test01.sh(相对路径)
用户(root)---bash---echo #不会开启子进程,父进程bash亲自上阵,他执行完进程会改变自己所在的位置状态
5、示例
(1)、搭建Yum
#!/bin/bash
#搭建yum软件仓库
mkdir /abc
mount /dev/cdrom /abc
rm -rf /etc/yum.repos.d/*.repo
echo "[abc]
name=abcabc
baseurl=file:///abc
enabled=1
gpgcheck=0" > /etc/yum.repos.d/abc.repo
(2)、编写脚本,安装网站服务并开启,浏览网站时显示"web-test~
#!/bin/bash
#搭建网站
yum -y install httpd
echo "web-test~~" > /var/www/html/index.html
systemctl restart httpd
(3)、编写脚本,安装ftp服务并开启且设置为开机自启
> 重定向标准输出
2> 重定向错误输出
&> 重定向所有输出
#!/bin/bash
yum -y install vsftpd &> /dev/null //将不需要的信息扔黑洞
systemctl restart vsftpd
systemctl enable vsftpd
三、shell变量
变量 使用固定的名称存放可能发生变化的值,可以提高脚本的灵活度、适应力
常量 固定不变的内容
1、变量的种类
(1)、自定义变量
名称可以用数字、字母、下划线,不能以数字开头,不能使用特殊符号,等号两边不能有空格
变量名称=值
- a=10 //创建变量(对变量赋值),名字是a,值是10
- a=30 //再次赋值,之前的会被覆盖
- echo $a //调用变量时使用$符号 #查看变量
- unset a //取消变量的定义 或者:退出定义变量的shell环境时,变量会自动实效
- a= //将变量a赋值为空,效果同上
- echo ${a}RMB //变量名容易与后续字符发生混淆时 使用大括号隔开
(2)、环境变量,由系统提前定义好,使用时直接调用
配置文件:/etc/profile 、 ~/.bash_profile
—env:列出所有的环境变量
—set:列出所有变量
全是大写
USER 当前用户名
UID 当前用户的id号
HOME 当前用户家目录
HOSTNAME 主机名
SHELL 当前用户的解释器
PWD 当前位置
PATH 存储命令的路径
PS1 一级提示符 ---[root@svr7 ~]#----- [\u@\h \W]\$
PS2 二级提示符 默认 > \ 换行继续敲
(3),位置变量与预定义变量
$1 执行脚本时后面第1个位置参数
$2 执行脚本时后面第2个位置参数
$3 执行脚本时后面第3个位置参数
$* 执行脚本时后面所有位置参数
$# 执行脚本时后面位置参数的个数
$$ 随机进程号
$? 判断上一条指令是否执行成功,0是成功,非0是失败
示例:
编写脚本,创建用户tom,配置密码123456
#!/bin/bash
useradd tom
echo "123456" | passwd --stdin tom
改良版
#!/bin/bash
useradd $1
echo "$2" | passwd --stdin $1
[root@svr7 opt]#bash useradd.sh natasha 123
四、变量的扩展知识
1、引号和反撇号
双引号 " ":允许扩展,以$引用其他变量
单引号 ' ' : 仅用扩展,即便$也视为普通字符(界定范围)
反撇号 ` `: 将命令的执行输出作为变量值 --- $() 与 ` ` 等效,但$()更方便嵌套使用
a=date //仅仅将四个字母赋值给a
a=`date` //将date执行结果赋值给a
a=$(date) //效果同上
[root@svr7 ~]# echo "当前的用户是:$USER"
当前的用户是:root
[root@svr7 ~]#echo '当前的用户是:$USER'
当前的用户是:$USER
[root@svr7 ~]#echo 当前的工作目录是:$(pwd)
当前的工作目录是:/root
2、read标准输入取值
read 从键盘读入变量值完成赋值
格式:read [ -p " 提示信息 " ] 变量名
-p是可以定义提示信息,
-t 可指定超时秒数
终端显示控制
stty -echo : 关闭终端输出(无显示)
stty echo : 恢复终端输出(有显示)
示例:
useradd $u
read -p "请输入密码" n
echo "$n" | passwd --stdin $u
stty -echo 屏蔽回显
stty echo 恢复回显
再次改良脚本:
#!/bin/bash
read -p "请输入用户名" u
useradd $u
stty -echo
read -p "请输入密码" n
stty echo
echo "$n" | passwd --stdin $u
3、使用export发布全局变量
局部变量 :仅仅在当前解释器进程中使用的变量
全局变量 :解释器产生的子进程中也可以使用的变量
a=10 //创建变量
export a //将已有变量发布为全局效果
export b=20 //创建变量的同时发布为全局效果
export -n b //将全局变量恢复为局部变量
注意,测试时要在父进程创建变量,然后可以执行bash进入子进程测试效果,如果要返回父进程要执行exit指令
pstree | grep bash #查看进程树
五、运算
加、减、乘、除、求模(取余数)
1、使用expr命令,可以运算并输出结果
expr 1 + 1 //加法,运算符号两边要有空格
expr 2 – 1 //减法
expr 2 '*' 2 //乘法,单引号可以屏蔽特殊符号*的功能,本身是通配符,而不是乘号,屏蔽之后就可以识别为乘号
expr 2 \* 2 # \是转义符号,可以屏蔽身后一个特殊符号的功能
expr 4 / 2 //除法
expr 5 % 2 //取余数
例子:
a=10
b=20
expr $a + $b
expr $a + 100
expr $a + $a
2,$[ ] 运算 使用$(( )) 可以实现相同效果
echo $[2*2]
echo $[2-2]
echo $[2/2]
echo $[2%2]
例子:
a=10
b=20
expr $a + $b
echo $[a+b]
3、let命令
主要服务变量,不输出结果
创建变量
变量自增减
let a=1+1 //创建变量
变量的自增减:
常规写法 主流写法
let a=a+1 let a++ #变量a加1
let a=a-1 let a-- #变量a减1
let a=a+10 let a+=10 #变量a加10
let a=a-10 let a-=10 变量a减10
let a=a*2 let a*=2 #变量a乘以2
let a=a/2 let a/=2 #变量a除以2
let a=a%3 let a%=3 #变量a除以3取余数
4、使用bc,可以进行小数计算
echo "10/3" | bc
3
echo "scale=2;10/3" | bc //scale可以定义结果是小数点后多少位
3.33