基本介绍
shell是一个命令解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序。用户可以用shell来启动、挂起、停止甚至是编写一些程序。
shell可以做什么?
服务器管理、服务器维护、备份数据库、管理集群……
shell脚本格式要求:
- 脚本以
#!/bin/bash
开头 - 脚本需要可执行权限
脚本执行方式:
-
输入脚本路径(./xxx/sh)
需要赋予脚本执行权限
-
直接执行(sh+脚本)
不需要赋予脚本执行权限
输出 hello world:
vim hello.sh
#!/bin/bash
echo "hello world!"
shell变量
shell变量可以分为 系统变量 和 用户自定义变量 。
系统变量: $HOME , $PWD , $SHELL , $USER 等等。
显示当前shell中所有变量:set
。
定义变量: 变量名=值
撤销变量: unset 变量
声明静态变量: readonly变量,注意: 静态变量不能unset
变量定义规则:
- 变量名可以由字母、数字和下划线组成,但是不能以数字开头
- 等号两侧不能有空格。
- 变量名称一般大写,这是一个规范。
命令返回值赋给变量:
1. A=`date` # 运行反引号里面的命令,并把结果返回给变量A。
2. A=$(date) # 等价于反引号
设置环境变量
基本语法:
- export 变量名=变量值 (功能描述:将shell变量输出为环境变量/全局变量)
- source 配置文件 (功能描述:让修改后的配置信息立即生效)
- echo $变量名 (功能描述:查询环境变量的值)
位置参数变量
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用位置参数变量。
基本语法:
- $n :n为数字,$0 代表命令本身,$1-$9 代表第一道第九个参数,十以上的参数需要用大括号包含,如${10}。
- $* :代表命令行中所有参数,$*把所有参数看做一个整体。 $@ :代表命令行中所有参数,$@把每个参数区分对待。
- $# :代表命令行中所有参数的个数。
预定义变量
预定义变量是事先已经定义好的变量,可以直接在shell脚本中使用。
基本语法
$$ :当前进程的进程号(PID)
$! :后台运行的最后一个进程的进程号(PID)
$? :最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行,如果这个变量的值为非0,(具体是哪个数,命令自己决定),则证明上一个命令执行不正确。
运算符
基本语法:
1. $((运算式)) 或 $[运算式] 或 expr m + n //expression表达式
2. 注意expr运算符间有空格,如果希望将expr的结果赋给某个变量,使用`` 反引号。
3. RES=`expr 2 + 3`
expr \* / % 乘,除,取余
条件判断
基本语法:
[ condition ] condition前后有空格,非空返回true。
[ xxxx ] # 返回true
[] # 返回false
[ condition ] && echo OK || echo notok # 条件满足,执行后面语句。
常用判断语句
字符串比较
=
两个整数比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并且是一个目录
if 单分支对分支
基本语法
if [条件判断式];then
程序
fi
# 或者
if [条件判断式]
then
程序
elif [条件判断式]
then
程序
fi
注意:[ 条件判断式 ] 中间有空格。
case 语句
基本语法:
case $变量名 in
"值1")
# 如果变量值为值1,执行程序1
;;
"值2")
# 如果变量值为值2,执行程序2
;;
# ...省略其他分支...
*)
# 如果变量的值都不是上面的值,则执行此程序
;;
esac
for循环
基本语法1:
for 变量 in 值1 值2 值3...
do
程序
done
基本语法2:
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
while 循环
基本语法:
while [ 条件判断式 ]
do
程序
done
注意:空格
read 获取输入
基本语法:
read (选项)(参数)
选项:
-p : 指定读取值时的提示符。
-t : 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待。
参数:变量:指定读取值的变量名
系统函数
basename 函数:
返回完整路径最后 / 的部分,常用于获取文件名
basename [pathname] [suffix]
suffix为后缀,如果suffix被指定了,会将最后结果的suffix去掉。
dirname函数:
返回完整路径最后 / 的前面的部分,常用于返回路径部分。
自定义函数
基本语法:
function funname()
{
Action;
[return int;]
}
调用,直接写: 函数名 值