Linux - Shell 编程
Shell 简介
Shell 是一种应用程序,该程序提供了一个界面,用户可以通过这个界面访问操作系统内核的服务,并将调用服务的结果返回给我们。
Linux 中不止有一种 Shell,我们最常用的是 bash。我们可以直接发一个指令给 Shell,也可以将指令编写成一个 Shell 脚本执行。
Shell 变量
Shell 变量分为系统变量和用户自定义变量:
-
系统变量如
$HOME、$PWD、$SHELL、$USER
可以通过echo
指令直接查看; -
用户可以自定义变量,自定义变量可以通过
set
指令查看;
用户自定义变量
用户自定义变量的基本语法:
-
[变量名]=[值]
:定义一个变量; -
unset [变量名]
:撤销变量; -
readonly
:声明静态变量,该变量不能被撤销;
自定义变量的规则:
-
变量名称可以由字母、数字和下划线组成,但是不能以数字开头;
-
等号两侧不能有空格;
-
变量名称一般习惯为大写,这是一个规范,我们遵守即可;
示例代码:
[root@ZQFLinux ~]# A=100
[root@ZQFLinux ~]# echo $A
100
[root@ZQFLinux ~]# unset A
[root@ZQFLinux ~]# echo $A
[root@ZQFLinux ~]# readonly READONLY=1
[root@ZQFLinux ~]# echo $READONLY
1
[root@ZQFLinux ~]# unset READONLY
-bash: unset: READONLY: cannot unset: readonly variable
[root@ZQFLinux ~]# A=`date`
[root@ZQFLinux ~]# echo $A
Thu Dec 8 13:23:37 CST 2022
全局变量(环境变量)
环境变量相关语法:
-
export [变量名]=[值]
:设置全局变量(环境变量); -
source [配置文件]
:刷新配置文件。在某文件中定义了全局变量后,需要刷新才能生效;
示例代码:
[root@ZQFLinux ~]# echo $JAVA_HOME
/root/java
[root@ZQFLinux ~]# export MY_SERVICE_PORT=8080
[root@ZQFLinux ~]# echo $MY_SERVICE_PORT
8080
位置参数变量
使用位置参数可以向 shell 脚本文件中传参,基本语法包括:
-
$n
:n 代表第几个参数。当 n = 0 时,代表执行的命令本身; -
$*
:该命令代表所有的参数,将所有参数视作一个整体; -
$@
:该命令代表所有的参数,将所有的参数视作单独的个体; -
$#
:该命令代表参数的个数;
新建脚本程序 myshell01.sh,编辑内容如下并保存:
#!/bin/bash
echo "执行命令:$0"
echo "参数1=$1;参数2=$2;"
echo "全体参数:$*"
echo "全体参数:$@"
echo "参数个数:$#"
执行脚本文件,查看结果:
[root@ZQFLinux myshell]# sh myshell01.sh
执行命令:myshell01.sh
参数1=;参数2=;
全体参数:
全体参数:
参数个数:0
[root@ZQFLinux myshell]# sh myshell01.sh 1 2
执行命令:myshell01.sh
参数1=1;参数2=2;
全体参数:1 2
全体参数:1 2
参数个数:2
预定义变量
预定义变量指 shell 提前设定好的一些变量,我们可以直接使用:
-
$$
:当前的进程号 PID; -
$!
:后台运行的最后一个进程的进程号 PID; -
$?
:最后一次执行的命令的返回状态,若返回 0 则证明上一个命令执行正确;
示例代码:
[root@ZQFLinux myshell]# echo $$
16905
[root@ZQFLinux myshell]# echo $!
[root@ZQFLinux myshell]# echo $?
0
Shell 运算符
Shell 中进行数据运算的基本语法有:
-
$((运算公式)
; -
$[运算公式]
; -
expr 运算公式
:使用该方法的运算符格式为+ - \*, /, %
(加减乘除取余);
新建脚本程序 myshell02.sh,编辑内容如下并保存,实现两个数值的求和运算:
#!/bin/bash
echo "$1 + $2 = $(($1+$2))"
运行脚本测试:
[root@ZQFLinux myshell]# sh myshell02.sh 200 300
200 + 300 = 500
Shell 条件判断
条件判断的基本语法:[ 判断条件 ]
,常用的判断条件包括:
-
对于字符串的比较使用
=
; -
对于整数的比较使用
-lt
/-le
/-eq
/-gt
/-ge
/-ne
,分别表示小于/小于等于/等于/大于/大于等于/不等于; -
根据文件的权限进行判断:
-
-r
:拥有读权限; -
-w
:拥有写权限; -
-x
:拥有执行权限;
-
-
根据文件类型进行判断:
-
-f
:文件存在且是一个常规的文件; -
-d
:文件存在且是一个目录; -
-e
:文件存在;
-
条件判断一般应用在流程控制当中,此处不单独演示代码。
Shell 流程控制
if 流程控制
if 流程控制的基本语法为if [ 条件判断式 ] then ... elif [ 条件判断式 ] then ... fi
新建脚本程序 myshell03.sh,编辑内容如下并保存,实现简单的猜数游戏:
#!/bin/bash
if [ $1 -gt 64 ]
then
echo "猜大了~"
elif [ $1 -lt 64 ]
then
echo "猜小了~"
elif [ $1 -eq 64 ]
then
echo "猜对了!"
fi
测试代码:
[root@ZQFLinux myshell]# sh myshell03.sh 42
猜小了~
[root@ZQFLinux myshell]# sh myshell03.sh 68
猜大了~
[root@ZQFLinux myshell]# sh myshell03.sh 64
猜对了!
case 流程控制
case 流程控制的基本语法为case $变量名 in "预期值1") ... ;; “预期值2” ... ;; esac
新建脚本程序 myshell04.sh,编辑内容如下并保存,实现简单的档位选择:
#!/bin/bash
case $1 in
"1")
echo "档位1"
;;
"2")
echo "档位2"
;;
"3")
echo "档位3"
;;
*)
echo "请重新输入~"
;;
esac
测试代码:
[root@ZQFLinux myshell]# sh myshell04.sh 1
档位1
[root@ZQFLinux myshell]# sh myshell04.sh 2
档位2
[root@ZQFLinux myshell]# sh myshell04.sh 3
档位3
[root@ZQFLinux myshell]# sh myshell04.sh 30
请重新输入~
for 流程控制
for 流程控制的基本语法为for (( 初始值;循环条件;循环条件增量 )) do ... done
新建脚本程序 myshell05.sh,编辑内容如下并保存,实现 1-100 求和:
#!/bin/bash
SUM=0
for (( i=1;i<=100;i++ ))
do
SUM=$(($SUM+$i))
done
echo "result=$SUM"
测试代码:
[root@ZQFLinux myshell]# sh myshell05.sh
result=5050
while 流程控制
while 流程控制的基本语法为while [条件判断 ] do ... done
新建脚本程序 myshell06.sh,编辑内容如下并保存,实现 1-x 求和:
#!/bin/bash
SUM=0
I=1
while [ $I -le $1 ]
do
SUM=$(($SUM+$I))
I=$(($I+1))
done
echo "result=$SUM"
测试代码:
[root@ZQFLinux myshell]# sh myshell06.sh 4
result=10
[root@ZQFLinux myshell]# sh myshell06.sh 100
result=5050
Shell 读取控制台输入
使用 read 命令读取控制台的输入,基本语法为read [选项] [变量名]
,常用选项有:
-
-p
:指定读取值时输出的提示; -
-t
:指定读取值时的等待时间,若超时则不再等待;
示例代码:
[root@ZQFLinux myshell]# read -p "请输入一个数:" A
请输入一个数:36
[root@ZQFLinux myshell]# echo $A
36
[root@ZQFLinux myshell]# read -t 3 -p "请输入一个数:" A
请输入一个数:
[root@ZQFLinux myshell]#
Shell 函数
Shell 系统函数
-
basename [string] [suffix]
:该函数返回路径字符串最后一个/
后边的部分,常用于获取文件名。若指定了 suffix,则会去除结果中的 suffix 指定字段; -
dirname [string]
:该函数返回路径字符串最后一个/
前面的部分,常用于获取路径;
示例代码:
[root@ZQFLinux myshell]# basename /root/myshell/myshell01.sh
myshell01.sh
[root@ZQFLinux myshell]# basename /root/myshell/myshell01.sh 01.sh
myshell
[root@ZQFLinux myshell]# basename /root/myshell/myshell01.sh .sh
myshell01
[root@ZQFLinux myshell]# dirname /root/myshell/myshell01.sh
/root/myshell
Shell 自定义函数
Shell 中用户自定义函数的基本语法为function 函数名 {...}
新建脚本程序 myshell07.sh,编辑内容如下并保存,实现两数求和:
#!/bin/bash
function getSum() {
SUM=$(($X1+$X2))
echo "result=$SUM"
}
read -p "请输入第一个数:" X1
read -p "请输入第二个数:" X2
getSum
测试代码:
[root@ZQFLinux myshell]# sh myshell07.sh
请输入第一个数:1
请输入第二个数:2
result=3