0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux中shell脚本编程

xCb1_yikoulinux 来源:一口Linux 作者:一口Linux 2022-04-18 11:58 次阅读

一、变量

1. shell脚本基础知识

编译型语言:如 c语言解释型语言:shell 脚本

shell脚本的本质:shell命令的有序集合

2.shell 编程的基本过程

基本过程分为三步:

  1. 建立shell文件:包含任意多行操作系统命令或shell命令的文本文件。——xx.sh
  2. 赋予shell文件执行权限,==用chmod命令修改权限==。
  3. 执行shell文件,直接在命令行上调用shell程序

示例:

  1. 建立shell文件 prog1.sh
data
  1. 赋予shell文件执行权限 (初始文本文件无执行权限)
chmod740prog1.sh
#或者
chmodu+xprog1.sh
  1. 执行shell文件
prog1.sh
#结果为
prog1.sh :notfound

原因是:shell在标准搜索路径中找不到prog1.sh4.正确的执行shell文件

./prog1.sh
#结果为
20091216日星期二145257CST

3. shell变量

shell允许用户建立变量存储数据,但不支持数据类型(整型,字符,浮点型),将任何赋给变量的值都解释为一串字符Variable = value

  • count = 1
  • echo $ count
  • DATE = data
  • echo $ DATE
bbe20d0a-beca-11ec-9e50-dac502259ad0.png在这里插入图片描述

==注意几点:==

  1. 变量没有类型

  2. =号两边不能加空格

  3. 变量必须是大写

  4. 赋值的时候要用``框起来

Bourne shell有如下四种变量:

  • 用户自定义变量

  1. 在shell编程中通常使用全大写变量:COUNT=1
  2. 变量的调用,在变量前加$:echo $HOME
  3. Linux shell / bash 从右向左赋值:Y=y、X=$Y、echo $X 、y
  4. 使用unset命令删除变量的赋值:Z=hello、echo $Z、hello、unset Z、echo$Z
  • 位置变量及命令行参数

  1. $0 与键入的命令行一样,包含脚本文件名
  2. $1,$2....$9 分别包含第一个到第九个命令行参数。
  3. $# 包含命令行参数的个数
  4. $@ 包含所有命令行参数:$1,$2,...$9
  5. $?包含前一个命令的退出状态
  6. $* 包含所有命令行参数:$1,$2,....$9
  7. $$ 包含正在执行进程的ID号

bc0696f2-beca-11ec-9e50-dac502259ad0.pngbc1c1108-beca-11ec-9e50-dac502259ad0.png

  • 预定义变量

bc3dc0d2-beca-11ec-9e50-dac502259ad0.pngbc4fce8a-beca-11ec-9e50-dac502259ad0.pngbc64431a-beca-11ec-9e50-dac502259ad0.pngbc7fdbfc-beca-11ec-9e50-dac502259ad0.png

bca78422-beca-11ec-9e50-dac502259ad0.png

必须在两位数边写上 { } ,才能正常值一一样。
bcbebffc-beca-11ec-9e50-dac502259ad0.png

  • 环境变量
  1. HOME:/etc/passwd文件中列出的用户目录
  2. IFS: Internal Field Separator , 默认为空格,tab及换行符
  3. PATH:shell搜索路径
  4. PS1,PS2:默认提示符($)及换行提示符(>)
  5. TERM:终端类型,常用的有vt100,ansi,vt200,xterm等。

二、shell 功能语句

shell 程序由零或多条shell语句构成。shell语句包括三类:说明性语句,功能性语句和结构性语句。

**说明性语句 ** 以 # 号开始到该行结束,不被解释执行功能性语句 任意的shell命令,用户程序或其他shell程序结构性语句 条件测试语句,多路分支语句,循环语句,循环控制语句等。

#!/bin/sh
#
#本程序说明
#
command_1
command_2#command_2的语句说明
....

常用功能性语句(命令)

==read== 从标准输入读入一行,并赋值给后面的变量,其语法为:

readvar

把读入的数据全部赋给var

readvar1var2var3

把读入行中的第一个单词(word)赋给var1 ,第二个单词赋给var2,.....把其余所有的词赋给最后一个变量。如果执行read语句时标准输入无数据,则程序在此停留等候,直到数据的到来或被终止运行。

#!/bin/bash
echo"inputanumber:"
readNUM
echo$NUM
bcd1ec62-beca-11ec-9e50-dac502259ad0.png在这里插入图片描述
#!/bin/bash
echo"inputyearmonthday:"
readYMD
echo"Todayis$Y-$M-$D"

bcf34a06-beca-11ec-9e50-dac502259ad0.png

==expr命令:==算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(*)和求模(%)等操作。例如

$expr12+5*3
27
$expr3-8/2
-1
$num=9
$sum=`expr$num*6`
$echo$sum
54

bd0818be-beca-11ec-9e50-dac502259ad0.pngbd1db5a2-beca-11ec-9e50-dac502259ad0.png

!!运算符间用空格分开!!

测试语句

==test语句==

test语句可测试三种对象:

字符串 / 整数 / 文件属性

每种测试对象都有若干测试操作符例如:

test"$answer"="yes"
#变量answer的值是否为字符串yes

test$num-eq18
#变量num的值是否为整数18

test-dtmp
#测试tmp是否为一个目录名

字符串测试:

s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0

整数测试:

a - eq b 测试a 与 b是否相等
a - ne b 测试a 与 b是否不相等
a - gt b 测试a 是否大于b
a - ge b 测试a 是否大于相等b
a - lt b 测试a 是否小于b
a - le b 测试a 是否小于等于b
#!/bin/bash

A="how"
B="hoW"
test$A=$B
echo$?//表示输出前一个语句的结果
bd2f065e-beca-11ec-9e50-dac502259ad0.png在这里插入图片描述
#!/bin/bash

A="how"
B="how"
test$A=$B
echo$?//表示输出前一个语句的结果

bd44216a-beca-11ec-9e50-dac502259ad0.png

相等为0(真),不等为1(假)

#!/bin/bash

A="how"
B="hoW"
test$A=$B
echo$?//表示输出前一个语句的结果

pwd
echo$?

lsfile
echo$?

bd64a08e-beca-11ec-9e50-dac502259ad0.png

最后ls file 没有,所以结果为2

#!/bin/bash

A=99
B=88
test$A-ne$B
echo$?//表示输出前一个语句的结果

test$A-gt$B
echo$?//表示输出前一个语句的结果
bd8130f0-beca-11ec-9e50-dac502259ad0.png在这里插入图片描述

三、shell 分支语句

1. 条件语句

==if ..then...fi==语法结构:

if表达式
then命令表
fi
  • 如果表达式为真,则执行命令表种的命令;否则退出if语句,即执行fi后面的语句
  • if和fi是条件语句的语句括号,必须成对使用;
  • 命令表中的命令可以是一条,也可以是若干条。
#!/bin/bash

if[$#-ne1]
then
echo"usage:$0filename"
exit
fi
if![-e$1]
then
echo"$1notexist"
exit
fi
if[-d$1]
then
echo"$1isadirextory"
fi

bda783b8-beca-11ec-9e50-dac502259ad0.png

if...then ..else..fi语句结构为:

if表达式
then命令表1
else命令表2
fi

如果表达式为真,则执行命令表1中的命令,在退出if语句;否则执行命令表2中的语句,在退出if语句。

注意:无论表达式是否为真,都有语句要执行

#!/bin/bash

if[$#-ne1]
then
echo"usage:$0filename"
exit
fi
if![-e$1]
then
echo"$1notexist"
exit
fi
if[-L$1]
then
echo"l"
elif[-d$1]
then
echo"-"
elif[-b$1]
then
echo"b"
else
echo"csp"
fi
bded84bc-beca-11ec-9e50-dac502259ad0.png在这里插入图片描述

2. 多路分支语句

==case...esac==多路分支语句case用于多重条件测试,语法结构清晰自然,

case字符串变量in//case语句只能检测字符串变量
模式1)
命令表1//各模拟中可用文件名元字符,以右括号结束
;;
模式2|模式3)
命令表2
;;//命令表以单独的双分号行结束,退出case语句
.....
模式n)
命令表n
;;//模式n常写为字符*,表示所有其他模式
esac//最后一个双分号行可以省略

判断选择——多路分支语句 示例1:

#!/bin/bash

echo-n"please choose (yes | no)?"
readR
case$Rin
yes|Yes|y|Y|YES)
echo"yes"
;;
no)
echo"no"
;;
*)
echo"wrong"
#;;
esac

be0b06a4-beca-11ec-9e50-dac502259ad0.png

判断成绩——多路分支语句 示例2:

#!/bin/bash

echo-n"please choose (yes | no)?"
readS
if[$S-lt0-o$S-gt100]
then
echo"noin[0-100]"
exit
fi

G=`expr$S/10`
case$Gin
9|10)
echo"$SA"
;;
6|7|8)
echo"$SB"
;;
*)
echo"$SC"
#;;
esac
be3c1582-beca-11ec-9e50-dac502259ad0.png在这里插入图片描述

四、shell 循环语句

1. 循环语句for的用法

当循环次数已经知道或确定时候,使用for循环语句来多次执行一条或者一组命令,循环体由语句括号do和done来限定。

格式为:

for变量名in单词表
do
命令表
done

变量依次取单词表中的各个单词,每取一次单词,就执行一次循环体中的命令。循环次数由单词数确定。命令表中的命令可以是一条,也可以是由分号或换行符分开的多条。如果单词表是命令行上的所有位置参数时,可以在for

实例代码:

#!/bin/bash

#forIin`ls/etc`
do
echo"$I"
done
be61c250-beca-11ec-9e50-dac502259ad0.png在这里插入图片描述

==seq命令== :列出一系列的数字seq 起始数字 中间分量 终止分量

#!/bin/bash
forIin`seq1210`
do
echo"$I"
done

be77be84-beca-11ec-9e50-dac502259ad0.png示例:拷贝当前目录下的所有文件到backup子目录下。使用语法为:./prog5.sh[filename]

#Thestatementoffor....do...done
if[!-d$HOME/backup]
then
mkdir$HOME/backup
fi
flist=`ls`
forfilein$flist//flist的值是ls的执行结果即当前目录下的文件名
do
if[$#=1]
then
if[$1=$file]//命令行上有一个参数时
then
echo"$filefound";exit
fi
else
cp$file$HOME/backup
echo"$filecopied"
fi
done
echo***BackupCompleted******

2. 循环语句while的用法

语法结构:

while命令或表达式
do
命令表
done

while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。

示例:

#!/bin/bash

I=0

while[$I-lt5]//-lt=<
do
I=`expr$I+1`
echo-n"inputscore:"
read$S

case`expr$S/10`in
9|10)
echo"A"
;;
6|7|8)
echo"B"
;;
*)
echo"C"
;;
esac
echo"$I"
done

3. 循环控制语句

==break 和 continue==

break n 则跳出n层;continue语句则马上转到最近的一层循环语句的下一轮循环上,continue n 则转到最近n层循环语句的下一轮循环上。

用法:prog7 整数 整数 整数 ...参数个数不确定,范围为1-10个 ,每个参数都是正整数。

示例:

#!/bin/bash

if[$#-ne5]
then
echo"argument5"
exit
fi

forI
do
if[`expr$I%2`-eq1]
then
echo"$I"
else
break
fi
done

若是break 的话 ,跳出整个循环。遇到偶数就跳出循环。be91ac18-beca-11ec-9e50-dac502259ad0.png

#!/bin/bash

if[$#-ne5]
then
echo"argument5"
exit
fi

forI
do
if[`expr$I%2`-eq1]
then
echo"$I"
else
continue
fi
done

若是continue的话 ,跳出当前循环。遇到偶数就跳出当前循环,继续执行下面语句bea32a92-beca-11ec-9e50-dac502259ad0.png

五、shell 函数

1. shell函数调用

函数调用格式:

方式1:
value_name=`function_name[arg1arg2...]`

函数的所有标准输出都传递给了主程序的变量

方式2:
function_name[arg1arg2...]
echo$?

获取函数的返回状态

获取函数的返回状态 ——示例:

grep_user()
{
R=`grep"$1"/etc/passwd|wc-l`
echo$R
return$R
}

echo-n"inputusername:"
readUSER
grep_user$USER
RET=$?
if[$USER-eq1]
then
echo"$USERexist"
else
echo"$USERnotexist"
fi

beb0b464-beca-11ec-9e50-dac502259ad0.png

若改为不返回值,用变量,函数的所有标准输出都传递给了主程序的变量

grep_user()
{
R=`grep"$1"/etc/passwd|wc-l`
echo$R
}

echo-n"inputusername:"
readUSER
RET=`grep_user$USER`
echo"----return$RET-----"
if[$USER-eq1]
then
echo"$USERexist"
else
echo"$USERnotexist"
fi
beda10c0-beca-11ec-9e50-dac502259ad0.png在这里插入图片描述

2. 函数变量作用域

  • 全局作用域:在脚本的其他任何地方都能够访问该变量
  • 局部作用域:只能在声明变量的作用域内访问
  • 声明局部变量的格式:
    • c Local variable_name = value
grep_user()
{
B=200
A=100
}

grep_user
echo"end:$A-$B"

结果发现函数内的变量,竟然是全局变量
beee2e20-beca-11ec-9e50-dac502259ad0.png

如果我们要局部变量就 加一个local

grep_user()
{
B=200
localA=100
}

grep_user
echo"end:$A-$B"
bf1b65ac-beca-11ec-9e50-dac502259ad0.png在这里插入图片描述

原文标题:Linux基础-shell脚本编程

文章出处:【微信公众号:一口Linux】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11216

    浏览量

    208767
  • 编程
    +关注

    关注

    88

    文章

    3576

    浏览量

    93545
  • Shell
    +关注

    关注

    1

    文章

    363

    浏览量

    23262

原文标题:Linux基础-shell脚本编程

文章出处:【微信号:yikoulinux,微信公众号:一口Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux Shell脚本入门到实战详解

    Linux Shell脚本入门到实战详解
    发表于 02-17 15:03 621次阅读

    嵌入式Linux入门(五、Shell脚本编程上:认识Shell脚本

    大家好,是矜辰所致,嵌入式 Linux入 门第五课,本课开始简单学习一下 Shell 脚本编程
    的头像 发表于 07-13 16:10 1525次阅读
    嵌入式<b class='flag-5'>Linux</b>入门(五、<b class='flag-5'>Shell</b><b class='flag-5'>脚本</b><b class='flag-5'>编程</b>上:认识<b class='flag-5'>Shell</b><b class='flag-5'>脚本</b>)

    Linux shell脚本分享

    今天浩道跟大家分享几个Linux运维中常用到的shell脚本
    发表于 07-18 09:53 542次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>shell</b><b class='flag-5'>脚本</b>分享

    100个Linux Shell脚本总结

    不知道大家有没有发现,会编写shell脚本的运维,工资不会低,并且他的工作会很轻松!今天浩道跟大家分享每一个Linux运维应知必会的100个shell
    的头像 发表于 12-05 09:28 1175次阅读

    linux shell 脚本入门

    1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序
    发表于 11-07 15:44 11次下载

    Linux Shell脚本编程基础和相关资料合集免费下载

    本文档的主要内容详细介绍的是Linux Shell脚本编程基础和相关资料合集免费下载。
    发表于 05-24 17:53 26次下载
    <b class='flag-5'>Linux</b> <b class='flag-5'>Shell</b><b class='flag-5'>脚本</b><b class='flag-5'>编程</b>基础和相关资料合集免费下载

    如何创建和执行一个简单的Linux shell脚本

     如果您愿意要尝试更长的shell脚本,请将下面的shell脚本(并附加为PDF和ODT文件)复制到文本编辑器,保存,使其可执行并运行。当
    的头像 发表于 11-06 17:28 1.3w次阅读

    Linuxshell脚本执的4种方式

    Linuxshell脚本的执行通常有4种方式,分别为工作目录执行,绝对路径执行,sh执行,shell环境执行。
    发表于 05-23 09:28 903次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>中</b><b class='flag-5'>shell</b><b class='flag-5'>脚本</b>执的4种方式

    Linux系统命令及shell脚本实践指南

    Linux系统命令及shell脚本实践指南资料下载。
    发表于 06-01 14:47 28次下载

    Linux开发_Makefile规则与Shell脚本语言

    介绍Linux下Makefile编程知识点,Shell脚本知识点。
    的头像 发表于 09-17 15:40 1227次阅读

    Linux开发_Shell脚本编程语言

    介绍LinuxShell编程,介绍shell里语句、变量、函数、运算符的使用。
    的头像 发表于 09-17 15:39 1160次阅读

    Linux命令行与shell脚本编写

    Linux命令行与shell脚本编写
    发表于 01-11 16:50 4次下载

    Linux Shell脚本经典案例分享

    ​ 作为一名 Linux 运维工程师,会写好的脚本不仅能提高工作效率,还能有更多的时间做自己的事。最近在网上冲浪的时候,发现大家对Shell脚本都有“心结”,要么觉得自己写出来不好
    发表于 06-16 14:03 626次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>Shell</b><b class='flag-5'>脚本</b>经典案例分享

    linux命令和shell编程有什么联系

    的命令,并提供了许多功能和特性,如变量、控制结构、函数等,这些功能和特性使得Shell编程成为可能。 其次,Linux命令是Shell编程
    的头像 发表于 11-08 10:53 876次阅读

    linux命令行与shell编程实战

    Linux命令行与Shell编程实战主要涉及以下内容: Linux命令行基础:学习Linux命令行的基本操作,如文件管理、进程管理、网络配置
    的头像 发表于 11-08 10:57 721次阅读