✅作者简介:大家好我是爱康代码
个人主页:链接: 点一下这里就进入爱康代码的主页链接,欢迎参观!!!
如果觉得博主的文章还不错的话,请三连支持一下博主哦
在linux系统中,shell不仅能够执行命令(启动、挂起、停止甚至编写一些程序)
,还可以使用shell编程进行任务自动化,进行系统管理任务、系统任务调度等,是一门非常优秀的编程语言!
Shell脚本程序是Shell命令语句的集合,保存在文本文档中,可直接使用文本处理器
运行和编程(如Vim)。Shell由Shell环境解释执行,Shell脚本在Linux系统中不需要编译、链接、及生成可执行文件,可直接由相应解释器解释执行
。
脚本格式要求:
(1)脚本必须以#!/bin/bash 开头,告诉系统应该用何种Shell来执行此脚本。
(2)脚本需要设置可执行权限。
脚本常用执行方式:
(1)输入脚本绝对路径或者相对路径(首先要设置+x权限)。
(2)直接用(sh+脚本)直接执行,不用+x权限。
直接使用文本编辑程序(Vim)
(1)创建一个hello.sh
vim hello.sh
#输入 i 进入文本模式,输入一下内容
#echo 是输出命令
(2)存盘推出:按Esc键回到正常模式,输入:wq!
(3)无可执行权限用(sh+脚本)
sh hello.sh
(4)设置脚本可执行权限 chmod命令,并用相对地址执行脚本
chmod u+x hello.sh
./hello.sh
注意:shell脚本通普通文件一样,可以没有扩展后缀,但为了方便区分,建议Bash脚本文件以sh结尾,如“shell.sh”。
Shell变量的介绍:
(1)Shell变量分为系统变量和用户自定义变量。
(2)系统变量:$HOME、$PWD、$HELL等等
(3)显示当前shell中所有变量:set
Shell变量的语法:
定义变量:变量=值,=两边不能有空格。
变量名区分大大写,建议大写。
通过变量名前加$符号访问它的内容。
撤销变量:unset 变量
声明静态变量:readonly变量,静态变量不能unset。
⭐️$(command)语法:
运行括号里面的结果,并把命令放回给一个变量
A=$(data),将data的值赋值给A变量。
引号的使用:
(1)一个参数包含一个或多个空白字符需要给参数加上引号。
(2)双引号:“$data”,把data变量替换成它的值
(3)单引号:’$data‘,不会发生替换行为。
效果演示:vim var.sh 创建脚本程序
#!/bin/bash
#定义变量A
A=100
#输出变量的值
echo A=$A
echo A="$A"
echo A='$A' #单引号不发生替换
#撤销变量A
unset A
echo "A=$A"
#$(command)命令,返回结果给变量
D=$(date)
echo 当前时间为:$D
起始也就是全局变量
,在一个脚本中定义,其他程序脚本都能使用的这个环境变量。
1.exprot 变量名=变量值 (将shell变量设置为环境变量)
2.source 配置文件 (让修改后的配置文件立即生效,记得运行前现加一句)
获取一个命令行的参数信息,可以使用位置参数实现。比如./envvar.sh 10 20 30,这就是一个执行shell的命令行,可以在脚本中获取参数信息。
基本语法:
1.$n:n代表数字,$0代表命令行内容,$1-$9代表第一到第九个参数,十个及十个以上需要用大括号包含,如${10}
2.$*:代表命令行中的所有参数
3.$#:代表命令行中参数的个数。
编写一个shell脚本:vim envvar.sh
#!/bin/bash
echo "当前脚本程序的名字:$0"
echo "当前第二个参数是:$2"
echo "当前传递了$#个参数”
echo "当前传递的参数分别为:$*"
~
shell设计时已经定义好的变量,可以直接在shell脚本中使用
基本语法:
1.$$:当前进程的进程号(PID)
2.$!:后台运行的最后一个进程的进程号
3.$?:最后一次执行的返回状态,如果这个变量的值为0.证明上一个命令正确执行;如果这个变量的值为非0(数值由命令自己决定),则证明上一个命令执行不正确。
执行程序:
#!/bin/bash
echo "当前程序执行的进程号:$$"
echo "最后一个进程的进程号:$!"
echo "执行结果:$?"
基本语法:
1. ( ( 运 算 式 ) ) 或 ((运算式))或 ((运算式))或[运算式]或者expr m+n //expression表达式
2.注意expr表达式有空格
3.expr *,/,% 乘,除,取余
4.将expr 赋值给变量需要加两个反引号` `
#!/bin/bash
#运算 (2+3)*2
RES=$(((2+3)*2))
echo RES=$RES
#expr形式
TEMP1=`expr 2 + 3`
TEMP2=`expr $TEMP1 \* 3`
echo TEMP2=$TEMP1
基本语法:
[ condition ] (注意condition 前后都要有空格) 非空返回true
if [condition]
then (表示if语句的开始)
…
fi (fi表示结束)
#!/bin/bash
#判断sing 等于 sing
if [ sing=sing ]
then
echo "sing和sing相等"
fi
~
语法格式:
if [ condition ]
then
语句1
elif [ condition2 ]
then
语句2
else
语句3
fi (结束)
#!/bion/bash
#answer.sh中的代码
if [ yes=yes ]
then
echo Good
else
echo Error
fi
exit 0
~
case $变量名 in
“值1”) 如果变量的值等于值1 ,则执行程序1 ;;
“值2”) 如果变量的值等于值2 ,则执行程序2 ;;
*) 如果变量的值以上值都不相等 ,则此执行程序 ;;
esac
#!/bin/bash
A="yes"
case $A in
yes) echo "第一条语句" ;;
no) echo "第二条语句";;
*) echo "其他语句"
esac
基本语法:
for 变量 in 集合
do
语句
done
#!/bin/bash
for a in x1,x2,x3
do
echo $a
done
exit 0
~
可以使用read命令将用户键盘输入赋值给一个变量。
read(选项)(参数)
选项:
-p:指定读取值是的提示符;
-t:指定读取值时的等待时间(秒),超时就不等待。
代码演示在下面while语句种一块演示
基本语法:
while [ condition ]
do
程序
done
#!/bin/bash
echo "请输入你的密码:"
read pws
while [ "$pws"!="123" ]
do
echo "sorry,try again"
read pws
done
echo "密码正确0"
exit 0
这里只介绍一个,作为参考:
basename:用于返回完整路径最后一个/的部分,常用于获取文件名。
basename [pathname] [suffix]
basename 命令会将所有前缀包括最后以一个“/”字符删除,然后将字符串显示出来。
suffix 为后缀,指定的后,basename会将pathname中的后缀suffix也去掉
基本语法:
[ function ] funname[()]
{
Action;
[return int;]
}
调用直接写函数名:funname [值]
#!/bash/bash
#实现两个求和,动态获取。
#定义函数
function getSum(){
SUM=$[$n1+$n2]
echo 两数之和=$SUM
}
#动态获取两个数
read -p "请输入第一个数n1=" n1
read -p "请输入第二个数n2=" n2
#调用函数,并传入参数
getSum $n1 $n2