一、shell 基本介绍
- shell是一个命令行解释器,使用它可以向Linux内核发送请求以便运行程序的界面系统程序,用户可以使用shell来启动,挂起,停止或编写一些程序。
- shell脚本的格式要求:
1、脚本要以#!/bin/bash
开头
2、shell脚本需要可执行权限 - 脚本的常用执行方式
1、方式一:输入脚本的相对路径或绝对路径 {需要先赋予脚本可执行权限}
2、方式二:sh 脚本名
:[ 例:sh test.sh
:执行test.sh脚本 ] {这个方式不需要可执行权限}
二、shell 的变量
- shell 变量介绍
1、Linux shell中的变量分为,系统变量和用户自定义变量
2、系统变量:如$HOME
等
3、显示当前shell中的所有变量:set
- shell 变量定义
1、定义变量:变量名=值 [ 例:val=10
定义变量“val”并赋值为10 ] { 重要 :使用变量时变量名前必须加$
例如:$val
}
2、撤销变量:unset 变量名 [ 例:unset val
:撤销变量“val” ]
3、声明静态变量:readonly 变量名 [ 例:readonly va=10l
:将变量“val”声明为静态变量并赋值为10 ] {声明为静态变量后不能撤销 } - shell变量定义的规则
1、变量名称有字母、数字、下划线组成,但是不能以数字开头
2、等号两边不能有空格
3、变量名称一般习惯为大写 - 将命令的返回值赋值给变量
1、A='命令'
:[ 例:A='data'
:将获取到的日期赋值给变量A ] *{命令需要使用单引号括起来}
2、A=$(命令)
:[ 例:A=$(data)
:此命令同上,写法上区别而已 ]
三、设置环境变量
- 基本语法
1、export 变量名=变量值
:[ 例:export TEST_HOME=/data/test
:将“TEST_HOME”环境变量设置为“/data/test” ] {将shell变量输出为环境变量/全局变量 }
2、source 配置文件
:[ 例:source /etc/profile
:使此配置文件生效 ] {使得修改后的配置信息立即生效}
3、:<<! 内容 !
:shell脚本中的多行注释 {需要注意的是:<<!
和!
要单独占用一行 }
4、# 内容
:shell脚本中的单行注释
四、shell的命令行参数变量
- 什么是命令行参数:
sh test.sh 10 20
,在执行脚本是后面的参数就是命令行参数,命令行参数可以是多个。 $n
:[ 例:$3
:代表获取到第三个命令行参数 ] {$0
:表示命令本身,n可以是1-9,即代表1-9位置的参数,如果命令行参数过于多大于9了怎么办,不用担心,&{10}
用大括号括起来即可 }$*
:此方法将获取到所有命令行参数并将此作为一个整体$@
:此方法将获取所有命令行参数,但不同的是它会将每个参数区分开,可以循环遍历$#
:此方法将获取命令行参数的个数
五、预定义变量
- 基本介绍:指的是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
$$
:获取当前进程的进程号(PID)$!
:后台运行的最后一个进程的进程号(PID)$?
:在shell中执行的最后一条命令的状态,若为:0 表示命令正常执行,若不为:0 则证明命令执行出现错误。
六、shell编程中的运算符
"$((运算式))" 或 $[运算式] 或 expr m + n
:{ 这就是shell中运算式的写法 其中使用``将expr括住。而且运算符两侧要有空格 }\* , / , % , + , -
:分别对应 乘、除、取余、加、减。
七、条件判断
if [ condition ]
:{ 条件判断语句,(condition表示条件或状态)要注意:condition前后要有空格 }- 字符串比较:
1、=
:比较字符串是否相等 - 整数比较
1、-lt
:小于
2、-le
:小于等于
3、-eq
:等于
4、-gt
:大于
5、-ge
:大于等于
6、-ne
:不等于 - 判读文件权限
1、-r
:有读的权限
2、-w
:有写的权限
3、-x
:有执行的权限 - 判断文件类型
1、-f
:文件存在并且是一个常规文件
2、-e
:文件存在
3、-d
:文件存在并且是一个目录 - 与 或 非
1、-a
:与 [ 例:[ val -gt 10 -a val -le 30 ]
:表示“10 <= val <= 30" ]
2、&&
: 与 [ 例:[ val -gt 10 ] && [ val -le 30 ]
:表示“10 <= val <= 30" ] {注意以上两种与写法上的区别}
3、-o
:或 [ 例:[ val -gt 10 -o count -le 20 ]
:表示”10<=val 或 count<=20" ]
4、||
:或 [ 例:[ val -gt 10 ] || [ count -le 20 ]
:表示”10<=val 或 count<=20" ]
5、!
:非 [ 例:[ ! val -gt 10 -a val -le 30 ]
:表示"val<10 与 val >30 ] - 条件判断示例
1、判断str1于str2是否相等
if [ str1 = str2 ]; then
echo "equal"
fi #表示结束判断
2、判断是否num1是否大于等于num2
if [ num1 -ge num2 ]; then
echo "大于或等于"
fi
3、判断文件是否存在(path表示文件路径)
if [ -f path ]; then
echo "存在"
else
echo "不存在"
fi
八、流程控制
- if 判断基本语法
1、单分支
if [ 条件判断式 ]; then
代码
fi
2、多分支
if [ 条件判断式 ]; then
代码
elif [ 条件判断式 ]; then
代码
else
代码
fi
- case 语句
case $变量名 in
"值1")
代码
;;
"值2")
代码
;;
*) #不满足以上条件则会执行此处
代码
;;
esca #结束case语句
- for 循环
1、基本语法 1
for 变量 in 值1 值2 值3...
do
代码
done
2、基本语法 2
for (( 初始值;循环控制条件;变量 )) #两个括号
do
代码
done
- while 循环
while [ 条件判断 ]
do
程序
done
- read 读取控制台输入
read(选项)(变量)
:{选项:-p
:指定读取时的提示符;-t
:指定读取时的等待时间,如果指定时间内没有输入,则不再等待;}
1、读取控制台输入的数值
read -p "请输入一个数字:" num1
echo "您输入的数字为:$num1"
2、读取控制台输入的数字并在3秒内完成输入
read -d 3 -p "请输入一个数字:" num2
echo "您输入的数字为:$num2"
九、函数
- 系统函数
1、basename : 功能 :返回路径最后“/”后的部分,常用于截取文件名
basename pathname suffix
:{ [suffix]为可选项,会将pathname中的suffix删除 返回剩余部分}
basename /home/bulid/test.txt #将返回test
basename hello123 123 #将返回J“hello”
2、dirname:功能:返回路径最后"/“前面的部分
dirname pathname
: [ 例:dirname /home/build/test.txt
:将返回”/home/build ]
- 自定义函数
fun() {
代码
}
- 自定义函数使用例子
1、两数相加(有返回值)
fun_add() {
val=`expr $1 + $2` # 这里的$1、$2表示是传递进来的参数
echo $val
}
result=$(fun_add $1 $2) # 这里的$1、$2表示命令行传递进来的参数,这样写会将val赋值给result
echo "result = $result"
2、两相加(无返回值)
fun_add() {
val=`expr $1 + $2`
echo "val = $val"
}
fun_add $1 $2 # 这样写会直接打印