文章目录
- 前言
- 一、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