目录
前言
什么是Shell编程
Shell脚本的执行方式
脚本格式要求
运行一个Shell
一个Shell例子
Shell的变量
shell变量的定义
设置环境变量
简单示范
位置参数变量
预定义变量
基本语法
运算符
应用案例
条件判断
单流程判断
常用判断条件
应用案例
多流程判断
case语句判断
for循环
while循环
read读取控制台输入
应用实例
函数
系统函数
basename
应用实例
dirname
应用实例
自定义函数
应用实例
前言
Linux操作系统在虚拟机VM上的安装【CentOS版本】-CSDN博客
Linux-(系统启动、用户管理)-CSDN博客
Linux-实用指令-CSDN博客
Linux-【组管理、权限管理、定时任务调度】-CSDN博客
Linux-进程管理【重点】-CSDN博客
Linux-RPM与YUM-CSDN博客
什么是Shell编程
Shell是一个命令行解释器,它为用户提供了一个向Linux内核直接发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell脚本的执行方式
脚本格式要求
- 脚本以“#!/bin/bash”开头
- 脚本需要有可执行权限
- Shell脚本文件的后缀名以“.sh”结束
运行一个Shell
运行shell脚本有两种方式:
- 输入脚本的绝对路径或相对路径来执行(需要有文件的写权限):例如:./hello.sh /root/hello.sh
- sh + 脚本(不需要有脚本写权限):如:sh hello.sh
一个Shell例子
- 创建一个名为“hello.sh”脚本文件
- 运行脚本后输出“hello world”
Shell的变量
- Linux shell中的变量分为:“系统变量”和“用户自定义变量”
- 系统变量:$HOME、$PWD等等
- 显示当前shell所有的变量:set
shell变量的定义
基本语法:
- 在shell中使用“#”注释
- 使用shell变量,在前面加上“$”符号
- 定义变量:变量名 = 值
- 撤销变量:unset 变量
- 声明静态变量:readonly 变量(静态变量不能使用unset撤销)
注意:
- shell变量定义时,“=”左右两边不能有空格,即“A=2”是正确的,“A = 2”是错误的
#!/bin/bash
#定义变量A
A=100
echo A = $A
echo "A = $A"
#撤销变量A
unset A
echo "A = $A"
#定义静态变量B,不能unset
readonly B=2
echo "B = $B"
unset B
执行效果:
将命令的返回值赋给变量:
- A=`date`(反引号),运行里面的指令,并把结果返回给变量A
- A=$(date),等价于反引号
#!/bin/bash
#将当前日期赋值给A
A=`date`
#将一句话赋值给B
B=$(echo "123")
#输出A和B
echo "这是A:$A"
echo "这是B:$B"
效果:
设置环境变量
基本语法:
- export 变量名=变量值(将shell变量输出为环境变量/全局变量)
- source 配置文件(让修改后的配置立即生效)
简单示范
- 在/ect/profile文件中定义TOMCAT_HOME环境变量(找个空白处写上即可)
- 查看环境变量TOMCAT_HOME的值
- 输入TOMCAT_HOME变量(在使用前,需要使用source /etc/profile让其生效)
位置参数变量
当执行一个shell脚本时,如果希望收到命令行的参数信息,就可以使用位置参数变量
如:./mysehll.sh 100 200,这执行一个shell命令行,也可以在myshell脚本中获取到参数信息
基本语法:
- $n:n为数字,$0表示命令本身,$1-$9表示第一到第九个参数,10以上的参数需要使用大括号包含:${10}
- $*:代表命令行中所有参数
- $@:代表命令行中所有的参数,不过$@把每个参数区分对待
- $#:代表命令行中所有参数的个数
#!/bin/bash
echo "0=$0 1=$1 2=$2"
echo "所有的参数=$*"
echo "$@"
echo "参数个数=$#"
效果:
预定义变量
shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
基本语法
- $$:当期那进程的进程号
- $!:后台运行的最后一个进程的进程号PID
- $?:最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行。如果这个变量的值非0,证明上一个命令执行不正确
运算符
基本语法:
- “$((运算式))”或“$[运算符]”或“expr m + n”
- 注意expr运算符之间要有空格
- *、/、%:乘、除、取余
应用案例
- 计算(2+3)*4的值
#!/bin/bash
#计算(2+3)*4的值
#第一种方式
RES1=$(((2+3)*4))
echo "RES1 = $RES1"
#第二种方式[推荐使用]
RES2=$[(2+3)*4]
echo "RES2 = $RES2"
#第三种方式
TEMP=`expr 2 + 3`
RES4=`expr $TEMP \* 4`
echo "RES4 = $RES4"
条件判断
单流程判断
基本语法:
if [ condition ](注意condition的前后要有空格)
then [condition]
fi
常用判断条件
- =:字符串比较
- -lt:小于
- -le:小于等于
- -eq:等于
- -gt:大于
- -ge:大于等于
- -ne:不等于
- -r:对文件有读权限
- -w:对文件有写权限
- -x:对文件有执行的权限
- -f:文件存在并且是一个常规文件
- -e:文件存在
- -d:文件存在并且是一个目录
应用案例
- “ok”是否等于“ok”,使用“=”
- 23是否大于22,使用“-ge”
- /root/test.sh文件是否存在,使用“-f”或“-e”
#!/bin/bash
#"ok是否等于"ok"
if [ "ok" = "ok" ]
then
echo "相等"
fi
#23是否大于22
if [ 23 -ge 22 ]
then
echo "大于"
fi
#/root/test.sh文件是否存在
if [ -f /root/test.sh ]
then
echo "存在"
fi
多流程判断
if [ condition ](注意condition的前后要有空格)
then [condition]
elif [ condition ]
then [condition]
fi
case语句判断
基本语法:
case $变量名 in
"值1")
condition
;;
"值2")
;;
esac
for循环
语法1:
for 变量 in 值1 值2 值3...
do
程序/代码
done
语法2:
for(( 初始值; 循环控制条件; 变量变化 ))
do
程序/代码
done
#!/bin/bash
for i in "$@"
do
echo "num is $i"
done
for((i=0;i<=$1;i++))
do
echo "i=$i"
done
while循环
基本语法1:
while [ 条件判断式 ]
do
程序/代码
done
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "最后结果SUM=$SUM"
read读取控制台输入
基本语法:
read(选项)(参数)
选项:
-p:指定读取值的提示符
-t:指定读取值时等待的时间(秒),如果没有在指定时间内输入,就不再等待
应用实例
- 读取控制台输入一个NUM1值
- 读取控制台输入一个NUM2值,在10秒内输入
#!/bin/bash
read -p "请输入一个数NUM1=" NUM1
echo "你输入的NUM1=$NUM1"
read -t 10 -p "请输入一个树NUM2,在10秒内输入" NUM2
echo "你输入的NUM2=$NUM2"
函数
shell编程和编程语言一样,有系统函数,也可以自定义函数。
系统函数
basename
功能:
返回完整路径最后“/”的部分,常用于获取文件名
语法:
basename [pathname] [suffix]
选项:
suffix为后缀,如果suffix被指定,basename会将pathname中的suffix去掉
应用实例
- 返回 /home/aaa/test.txt的“test.txt”部分:
dirname
功能:
返回完整路径最后“/”的全面的部分,常用于返回路径部分
语法:
dirname 文件绝对路径
应用实例
- 返回/home/aaa/test.txt的“/home/aaa”部分
自定义函数
基本语法:
[ function ] function_name [()]
{
action;
[return int;]
}
调用直接写函数名:“function_name [值]”
应用实例
- 计算输入两个参数的和,getSum
#!/bin/bash
#自定义函数getSum
function getSum()
{
SUM=$[$n1+$n2]
echo "和是=$SUM"
}
#输入两个值
read -p "输入一个数n1=" n1
read -p "输入一个数n2=" n2
#调用自定义函数getSum
getSum $n1 $n2
效果: