Shell脚本编程

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写―些程序。

Shell脚本的执行方式

脚本格式要求

1)脚本以#!/bin/bash开头(可省略)
2)脚本需要有可执行权限
3)为了阅读方便,一般后缀为.sh

脚本的常用执行方式

方式1(输入脚本的绝对路径或相对路径)

1)首先要赋予helloworld.sh 脚本的+x权限
2)执行脚本

方式2(sh 脚本)

说明:不用赋予脚本+x权限,直接执行即可
例如
先新建一个shell文件vim myShell.sh
在里面写入:echo "hello world!" wq保存退出
赋予shell文件可执行权限:chmod 744 myShell.sh
用相对路径方式执行:./myShell.sh 或绝对路径方式执行:/root/shell/myShell.sh或用sh 脚本方式执行:sh ./myShell.sh

Shell的变量

shell的变量的介绍

1)Linux Shell中的变量分为,系统变量和用户自定义变量。
2)系统变量:$HOME、$PWD、$SHELL、$USER等等
例如: echo $HOME
3)显示当前shell中所有变量:set。

shell变量的定义

基本语法

1)定义变量:变量=值
2)撤销变量: unset 变量
3)声明静态变量:readonly 变量,注意:不能unset
例如:

A=100
echo "A=$A"
#输出:A=100

unset A
echo "A=$A"
#输出:A=

readonly A=101
unset A
echo "A=$A"
#输出报错

shell变量

shell变量的定义

1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
2)等号两侧不能有空格。
3)变量名称一般习惯为大写。

将命令的返回值赋给变量

1)A=ls -la反引号,运行里面的命令,并把结果返回给变量A
2)A=$(ls -la)等价于反引号
例如:

RESULT=`ll /home`
echo $RESULT

MY_DATE=$(date)
echo "date=$MY_DATE"

设置环境变量

基本语法
1)export 变量名=变量值 (功能描述:将shel1变量输出为环境变量)
2)source 配置文件 (功能描述:让修改后的配置信息立即生效)
3)echo $变量名 (功能描述:查询环境变量的值)

注意:在输出JAVA_HOME环境变量前,需要让其生效source /etc/profile
例如:
1)在/etcprofile文件中定义TOMCAT_HOME环境变量

#定义一个自己的环境变量 
TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME

2)查看环境变量TOMCAT_HOME的值

echo STOMCAT_HOME

多行注释:
:<<! 注释内容
!

位置参数变量

介绍

当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如: ./myshell.sh 100 200 ,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息

基本语法

$n (功能描述: n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$# (功能描述:这个变量代表命令行中所有参数的个数)
例如:

echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数:$#"

./position.sh 30 60 执行
结果:

./position.sh 30 60
30 60
30 60
参数个数:2

预定义变量

基本介绍

就是shel设计者事先已经定义好的变量,可以直接在shell脚本中使用

基本语法

$$ (功能描述:当前进程的进程号(PID) )
$! (功能描述:后台运行的最后一个进程的进程号(PID))
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行﹔如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

例如:
在一个she1l 脚本中简单使用一下预定义变量

echo "当前的进程号=$$"
#加& 后台的方式运行 myShell.sh
./myShell.sh &
echo "最后的进程的号=$!"
echo "执行的值=$?"

运算符

基本介绍

学习如何在shel1中进行各种运算操作。

基本语法

1)"((运算式))"或“[运算式]”

  1. expr m + n
    注意expr运算符间要有空格
  2. expr m - n
  3. expr *,/,% 乘,除,取余
    例如:计算(2+3)x4的值
#第一方式$()
RESULT1=$(((2+3)*4))
echo "result1=$RESULT1"

#第二种方式[] 推荐使用
RESULT2=$[(2+3)*4]
echo "result2=$RESULT2"

#使用expr
ITEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
echo " result3=$RESULT3"

请求出命令行的两个参数的和:

SUM=$[$1+$2]
echo "SUM=$SUM""

条件判断

基本语法

[ condition ] (注意condition前后要有空格)

非空返回true,可使用$?验证(0为true , >1为false)

[ aaa ] 返回true
[] 返回false
[ condition ] && echo oK || echo notok 条件满足,执行后面的语句

判断语句

常用判断条件

1)两个整数的比较

=字符串比较
-lt小于
-le小于等于
-eq等于
-gt大于
-ge大于等于
-ne不等于

2)按照文件权限进行判断

-r有读的权限
-w有写的权限
-x有执行的权限

3)按照文件类型进行判断

-f文件存在并且是一个常规的文件
-e文件存在
-d文件存在并是一个目录

例如:

案例1:"ok"是否等于"ok"

f [ "ok" = "ok" ]
then
    echo "equal"
fi

案例2:23是否大于等于22

if [ 23 -gt 22 ]
then
    echo "大于"
fi

案例3:/root/shell/aaa.txt目录中的文件是否存在

if [ -e / root/shell/aaa.txt ]
then
    echo "存在"
fi

流程控制

if判断

基本语法

if[条件判断式];then
  程序
fi

或者

if[条件判断式]
then
  程序
elif[条件判断式]
then
  程序
fi

注意事项:(1)[条件判断式],中括号和条件判断式之间必须有空格
(2)推荐使用第二种方式
案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出"及格了",如果小于6o,则输出“不及格"

if [ $1 -ge 60 ]
then
    echo "及格了"
elif [ $1 -lt 60 ]
then
    echo "不及格"
fi

casse语句

基本语法

case \$变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
...省略其他分支..
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

案例﹔当命令行参数是1时,输出"周一",是2时,就输出"周二",其它情况输出“other"

case $1 in
"1")
echo "周—"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac

for循环

基本语法

for 变量 in 值1 值2 值3...
do
  程序
done

案例:打印命令行输入的参数

#使用$*
for i in "$*"
do
echo "the num is $i"
done
echo "========"
#使用$@
for j in "$@"
do
echo "the num is $j"
done

"$*"和"$@"不加引号也可,效果相同

基本语法2

for((初始值;循环控制条件;变量变化))
do
  程序
done

案例:从1加到100的值输出显示

#定义一个变量
SUM=0
for((i=1;i<=100; i++))
do
   SUM=$[$SUM+$i]
done
echo "sum=$SUM"

while循环

基本语法1

while [条件判断式]
do
  程序
done

案例:从命令行输入一个数n,统计从1+..+ n的值是多少?

SUM=0
i=0
while [ $i -le $1 ]
do
    SUM=$[$SUM+$i]
    i=$[$i+1]
done
echo "sum= $SUM"

read读取控制台输入

基本语法

read (选项) (参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒〉,如果没有在指定的时间内输入,就不再等待了。
参数:
变量:指定读取值的变量名
案例1:读取控制台输入一个num值

read -p "请输入一个数num1=" NUM1
echo "你输入的值是num1=$NUM1"

案例2:读取控制台输入一个num值,在10秒内输入

read -t 10 -p "请输入一个数num2=" NUM2
echo "你输入的值是num2=$NUM2"

函数

函数介绍

shell编程和其它编程语言一样,有系统函数,也可以自定义函数。

系统函数

. basename基本语法

功能:返回完整路径最后/的部分,常用于获取文件名
basename [pathname] [suffix]
basename [string] [suffix] (功能描述: basename命令会删掉所有的前缀包括最后一个('/')字符,然后将字符串显示出来。
选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
案例:请返回/home/aaa/test.txt的“test.txt”部分
basename /home/aaa/test.txt
会返回test.test
如果输入:basename /home/aaa/test.txt .txt
则会返回test

. dirname基本语法

功能:返回完整路径最后/的前面的部分,常用于返回路径部分
dirname文件绝对路径〈功能描述:从给定的包含绝对路径的文件名中去除文件名〈非目录的部分)然后返回剩下的路径(目录的部分))
案例:请返回/home/aaa/test.txt 的/home/aaa
dirname /home/aaa/test.txt
会返回/home/aaa

自定义函数

基本语法

[ function ] funname[()]
{
    Action;
    [return int;]
}  

调用直接写函数名:funname [值]
案例:计算输入两个参数的和

function getSum(){
    SUM=$[$n1+$n2]
    echo "和是=$SUM"
}
read -p "请输入第一个数n1" n1
read -p "请输入第二个数n2" n2

调用getSum

getsum $n1 $n2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容