什么是shell
在Linux内核与用户之间的解释器程序
通常指 /bin/bash
负责向内核翻译及传达用户/程序指令
相当于操作系统的“外壳”
shell使用方式
交互式 —— 命令行
人工干预、智能化程度高
逐条解释执行、效率低
非交互式 —— 脚本
需要提前设计、智能化难度大
批量执行、效率高
方便在后台静悄悄地运行
shell脚本:提前写好可执行的语句,可以完成特定任务的文件按顺序、批量化执行
shell脚本编写规范
1. 声明解释器
#!/bin/bash
2. 编写注释
#可以描述脚本功能、变量作用等信息
3. 执行指令
ls
cd
...
...
脚本的执行方式
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 会开启子进程
3. 使用source 或者. 执行脚本,无需x权限
source test01.sh
用户(root)---bash---echo 不会开启子进程
shell变量
变量: 使用固定的名称存放可能发生变化的值,可以提高脚本的灵活度、适应力
常量: 固定不变的内容
变量的种类
1. 自定义变量
特点: 名称可以用数字、字母、下划线,不能以数字
规则: 开头,不能使用特殊符号,等号两边不能有空格
格式:shell变量名称=值
a=10 //创建变量(对变量赋值),名字是a,值是10
a=30 //再次赋值,之前的会被覆盖
echo $a //调用变量时使用$符号
unset a //取消变量的定义
a= //将变量a赋值为空,效果同上
echo ${a}RMB //变量名容易与后续字符发生混淆时使用大括号隔开
2. 环境变量
特点: 由系统提前定义好,使用时直接调用
USER
当前用户名
UID
当前用户的id号
HOME
当前用户家目录
HOSTNAME
主机名
SHELL
当前用户的解释器
PWD
当前位置
PATH
存储命令的路径
PS1
一级提示符
PS2
二级提示符
3. 位置变量与预定义变量
$1
执行脚本时后面第1个位置参数
$2
执行脚本时后面第2个位置参数
$3
执行脚本时后面第3个位置参数
$*
执行脚本时后面所有位置参数
$#
执行脚本时后面位置参数的个数
$$
当前程序的进程号(该号码是随机的)
$?
判断上一条指令是否执行成功,0是成功,非0是失败
变量的扩展知识
1. 引号和反撇号
" " 双引号 界定范围
a=10
echo "$a" //正常调用变量
' ' 单引号 界定范围 屏蔽特殊符号的功能
echo '$a' //无法调用变量,$被屏蔽
反撇号 获取命令的执行结果,还可以使用$( )实现相同效果
a=date //仅仅将四个字母赋值给a
a=`date` //将date执行结果赋值给a
a=$(date) //效果同上
2. 使用read指令
#!/bin/bash
read -p "请输入用户名" u //-p是可以定义提示信息,u相当于自
定义变量名称,可以存储用户看到提示信息后输入的字符
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
数值运算
加、减、乘、除、求模(取余数)
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
(( )) 可以实现相同效果
echo $[2*2]
echo $[2-2]
echo $[2/2]
echo $[2%2]
a=10
b=20
expr $a + $b
echo $[a+b]
使用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取余数
使用bc,可以进行小数计算
echo "1.1+1" | bc
echo "10/3" | bc
echo "scale=2;10/3" | bc //scale可以定义结果是小数点后多少位