文章目录
- 前言
 - 一、shell脚本执行的方式
 - 1.格式要求
 - 2.脚本常用执行方式
 - 2.1 . 输入脚本的绝对路径或相对路径进行执行
 - 2.2 使用 sh + 脚本的方式
 - shell 的注释语法
 
- 二、shell 变量
 - 1.shell变量介绍
 - 2.shell 变量的定义
 - 定义变量
 - 定义变量的规则
 - 将命令的返回值赋给变量
 
- 3.设置环境变量
 - 3.位置参数变量
 - 基本语法
 
- 4.预定义变量
 
- 三、运算符
 - 四、条件判断
 - 五、流程控制
 - 1.if判断语句
 - 2.case判断语句
 - 3.for循环语句
 - 4.while循环语句
 
- 六、read读取控制台输入
 - 七、函数
 - 系统函数
 - 自定义函数
 
前言
shell脚本编程是linux中重要的一个环节,熟悉shell脚本编程,我们可以更好的在linux环境下工作。
一、shell脚本执行的方式
1.格式要求
脚本要以#!/bin/bash 开头
2.脚本常用执行方式
2.1 . 输入脚本的绝对路径或相对路径进行执行
这个没什么好说的,只说一点,这种执行方式需要有执行权限。
2.2 使用 sh + 脚本的方式
bash 脚本的路径
这种方式不需要有执行权限就可以执行
 
shell 的注释语法
# 是shell的单行注释
:<<! xxxx !是shell的多行注释,我建议多行注释的符号各占一行,例如下面这样:<<!
xxxx
xxxxx
!
二、shell 变量
1.shell变量介绍
代码如下(示例):
linux shell中的变量分为,系统变量和用户自定义变量
 系统变量:$HOME,$PWD,$SHELL,$USER等等
 显示当前shell中所有的变量:set
2.shell 变量的定义
定义变量
1.定义变量:变量名=值
 2.撤销变量:unset 变量
 3.声明静态变量:readonly 变量名=值
 注意,静态变量不能使用unset
下面的代码会在最后一行报错
#!/bin/bash
# 定义变量A
A=100
# 输出变量需要加上$
echo A=$A
echo "A=$A"
# 撤销变量A
unset A
echo "A=$A"
# 声明静态的变量B=2,不能unset
readonly B=2
echo "B=$B"
unset B
 
定义变量的规则
变量名称可以由字母、数字和下划线组成,但是不能以数字开头
 5A=100就是错的
 等号两侧不能有空格
 变量名称一般习惯为大写,这个是一个规范,遵守即可
将命令的返回值赋给变量
A=`date` 反引号,运行里面的命令,并把结果返回给变量A
 A=$(date) 等价于 A=`date`
3.设置环境变量
(关于这个,如果你之前在linux环境下配置过java的环境变量,这个可以不用看,步骤是一模一样的)
 基本流程
- export 变量名=变量值(一般都是在/etc/profile里面写环境变量)
 - source 配置文件
 - echo $变量名
 
3.位置参数变量
位置参数变量,用大白话来说,就是当你用命令行执行这个shell脚本文件的时候,来获取这行命令里面的一些东西
基本语法
- $n(n为数字,$0代表命令本身,$1~$9代表第一到第九个参数,如果要获取第十个以上的参数,需要这样写 ${10} )
 - $*(这个变量代表命令行中的所有参数,但是把所有的参数看成一个整体)
 - $@ (这个变量也是代表命令行中的所有参数,但是$@把每个参数区分对待)
 - $# (这个变量代表命令行中的所有参数的个数)
 
下面有一个shell脚本可以供大家理解
#!/etc/bash
echo "0=$0 1=$1 2=$2"
for i in "$*";do
 echo $i
done
for i in "$@";do
echo $i
done
echo "number=$#"
~                   
 

 $ @ 与 $ * 如果不在双引号里面的效果是一样的,但是如果在双引号里面
 $ * 就会把所有的参数当作一个东西来看,这在上面的代码里面已经看的很清楚了,
 $ @ 则是分开的
4.预定义变量
大白话就是shell设计者已经定义好的变量,可以直接使用
- $$ (获得当前进程的进程号(PID))
 - $! (后台运行的最后一个进程的进程号(PID))
 - $?(最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确了)
 
#!/bin/bash
echo "当前执行的进程id=$$"
# 以后台的方式运行一个脚本,并获得他的进程号
. position.sh 100 200 &
echo "最后一个后台方式运行的进程id=$!"
echo "执行结果是=$?"
 

三、运算符
基本语法
- $((运算式)) 或 $[运算式] 或 expr m + n (expr代表 expression ,expr的写法中运算符之间要有空格)
 - 乘号 \*(对,就是这么奇怪,有反斜杠)
 - 除号 /
 - 取余 %
 - 如果希望将expr的运算结果赋给某个变量,可以使用我们之前学习的反引号(就是1左边的那个)``
 
#!/bin/bash
#案例1:计算(2+3)*4的值
#使用第一种方式
RES1=$(((2+3)*4))
echo "res1=$RES1"
#使用第二种方式
RES2=$[(2+3)*4]
echo "res2=$RES2"
#使用第三种方式
TMP=`expr 2 + 3`
RES4=`expr $TMP \* 4`
echo "temp=$TMP"
echo "res4=$RES4"
                     
 

四、条件判断
判断语句
 基本语法
- [ condition ] (注意!!!condition前后要有空格),非空返回true,可使用$?验证
常用判断条件 
- 字符串比较 =
两个整数的比较 
-  
-lt 小于
 -  
-le 小于等于
 -  
-eq 等于
 -  
-gt 大于等于
 -  
-ne不等于
按照文件权限进行判断 -  
-r 有读的权限
 -  
-w 有写的权限
 -  
-x 有执行的权限
按照文件类型进行判断 -  
-f文件存在并且是一个常规的文件
 -  
-e 文件存在
 -  
-d 文件存在并且是一个目录
 
照例来个代码
#!/bin/bash
#案例1:"ok"是否等于ok
# 判断语句,使用 =
if [ "ok" = "ok" ]
then
        echo "equal"
fi
# 案例2:23是否大于等于22
#判断语句:使用-ge
if [ 23 -ge 22 ]
then
        echo "大于"
fi
# 案例3:/shellcode/aaa.txt 目录中的文件是否存在
# 判断语句:使用 -f
if [ -f /shellcode/aaa.txt ]
then
        echo "存在"
fi
 

五、流程控制
1.if判断语句
(这个我不再多说了,相信学linux的各位至少学过一门编程语言)
 基本语法
 单分支
if [ 条件判断式 ]
then
代码
fi
或者 多分支
if [ 条件判断式 ]
then
代码
elif [条件判断式]
代码
elif [条件判断式]
代码
…(这里指可以写多个elif)
else(else可省略)
代码
fi
2.case判断语句
(这个跟java 里面的 switch case 类似,但是看起来非常的诡异)
 基本语法
case $变量名 in
“值1”)(注:如果变量的值等于值1,则执行程序1)
代码
;;
“值2”)(注:如果变量的值等于值2,则执行程序2)
代码
;;
*)(注:如果变量的值都不是以上的值,则执行下面的代码)
代码
;;
esac
#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other..."
;;
esac
 

3.for循环语句
基本语法
for 变量 in 值1 值2 值3
do
程序
done
或者
for ((初始值;循环控制条件;变量变化))
do
程序
done
#!/bin/bash
for i in "$*"
do
 echo $i
done
for i in "$@"
do
echo $i
done
 
#!/bin/bash
SUM=0
for ((i=0;i<=$1;i++))
do
SUM=$[$SUM+$i]
done
echo $SUM
 

4.while循环语句
while [条件判断式]
do
程序
done
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
        SUM=$[$SUM+$i]
        i=$[$i+1]
done
echo "执行结果=$SUM"
 

六、read读取控制台输入
基本语法
read (选项) (参数)
选项:
-p :指定读取值时的提示符;
-t ; 指定读取值时的等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。。
参数:
变量:指定读取值的变量名
注意!!! read 与 $n 不同,read的读取输入是必须要输入的,如果你不输入,脚本> 会一直在那个地方堵塞
#!/bin/bash
#读取控制台输入一个NUM1值
read -p "请输入一个数NUM1=" NUM1#这里要注意 NUM1 跟前面的双引号要有空格,下面的NUM2也是如此
echo "你输入的NUM1=$NUM1"
# 读取控制台输入一个NUM1值,在10秒内输入
read -t 10 -p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2=$NUM2"
 

七、函数
- 函数介绍
shell编程和其他编程语言一样,有系统函数,也可以自定义函数。系统函数中,我们这里就介绍两个。 
系统函数
basename基本语法
 功能:返回完整路径最后 / 的部分,常用用于获取文件名
basename [pathname] [suffix]
(功能描述:basement命令会删除所有的前缀包括最后一个(“/”)字符,然后将字符串显示出来)
suffix 为后缀,如果suffix 被指定了,basename 会将pathname 或 string 中的 suffix 去掉

dirname 基本语法
功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分
语法
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名)

自定义函数
基本语法
[ function ] funname[()]
{
Action;
[return int;]
}
调用直接写函数名:funname [值]
#!/bin/bash
function getSum() {
        read -p "请输入一个数n1=" n1
        read -p "请输入一个数n2=" n2
        SUM=$[$n1+$n2]
        echo "和是=$SUM"
}
getSum
 





![[附源码]SSM计算机毕业设计“云味坊”购物网站JAVA](https://img-blog.csdnimg.cn/6e1d891bbc7f415a95be21b732fff5db.png)











![[附源码]计算机毕业设计JAVA高校资源共享平台](https://img-blog.csdnimg.cn/087a846c9f9a4bac97545a69b74b126f.png)


