当前位置: 首页 > news >正文

Day3-shell脚本编程

1. shell脚本-变量

1.1 shell脚本的介绍
shell脚本的本质:shell脚本语言是解释型语言,是shell命令的有序集合shell编程的基本过程(三步)step1. 建立shell文件(一般以.sh结尾),包含任意多行操作系统命令或shell命令的文本文件step2. 赋予shell文件执行权限,用chmod命令修改权限step3. 执行shell文件,直接在命令行上调用shell程序
1.2 shell脚本的变量
shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),将任何赋给变量的值都解释为一串字符变量名 = 变量值
Bourne Shell有以下四种变量:用户自定义变量位置变量即命令行参数预定义变量环境变量用户自定义变量:在shell编程中通常使用全大写变量,方便识别- $ COUNT=1变量的调用:在变量前加$- $ echo $HOME使用unset命令删除变量的赋值位置变量:$0 与键入的命令行一样,包含脚本文件名$1,$2,....$9  分别包含第一个到第九个命令行参数$# 包含命令行参数的个数$@ 包含所有命令行参数$? 包含前一个命令的退出状态$* 包含所有命令行参数$$ 包含正在执行进程的ID号环境变量:HMOE: /etc/passwd文件中列出的用户主目录PATH: shell搜索路径
#测试案例
linux@ubuntu:~/Linux_c/day03$ count=1
linux@ubuntu:~/Linux_c/day03$ echo $count
1
linux@ubuntu:~/Linux_c/day03$ count=10.5
linux@ubuntu:~/Linux_c/day03$ echo $count
10.5
linux@ubuntu:~/Linux_c/day03$ count=abcd
linux@ubuntu:~/Linux_c/day03$ echo $count
abcd
​
linux@ubuntu:~/Linux_c/day03$ Z=hello
linux@ubuntu:~/Linux_c/day03$ echo $Z
hello
linux@ubuntu:~/Linux_c/day03$ unset Z
linux@ubuntu:~/Linux_c/day03$ echo $Z

2. shell脚本-功能语句

shell程序由零或多条shell语句构成。shell语句包括三类:说明性语句、功能性语句和结构性语句。
说明性语句:以#号开始到该行结束,不被解释执行
功能性语句:任意的shell命令、用户程序或其他shell程序
结构性语句:条件测试语句、多路分支语句、循环语句、循环控制语句等常用功能性语句(命令):read从标准输入读入一行,并赋值给后面的变量,语法为:read var    #把读入数据全部赋值给varexpr命令算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、除(/)和求模(%)test命令test语句测试三种对象:字符串  整数 文件属性每种测试对象都有若干测试操作符,例如:.test "$answer" = "yes"变量answer的值是否为字符串yestest $num -eq 18变量num的值是否为整数18test -d tmp测试tmp是否为一个目录名字符串测试:=       测试俩个字符串的内容是否完全一样(等于为0,不等为1)!=      测试俩个字符串的内容是否有差异-z s1   测试s1字符串的长度是否为0-n s1   测试s1字符串的长度是否不为0整数测试:-eq     =-ne     !=-gt     >-ge     >=-lt     <-le     <=文件属性测试:-d name  是否为一个目录-e name  是否存在-f name  是否为普通文件-L name  是否为符号链接-r name  是否存在且为可读-w name  是否存在且为可写-x name  是否存在且为可执行-s name  是否存在且其长度不为0f1 -nt f2  文件f1是否比文件f2更新f1 -ot f2  文件f1是否比文件f2更旧
linux@ubuntu:~/Linux_c/day03$ vi demo4.sh
​
#!/bin/bash 
​
echo "input year mouth day:"
read Y M D
echo "Today is $Y-$M-$D"
​
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo4.sh
linux@ubuntu:~/Linux_c/day03$ ./demo4.sh
input year mouth day:
2020
Today is 2020--
linux@ubuntu:~/Linux_c/day03$ ./demo4.sh
input year mouth day:
2010 10
Today is 2010-10-
linux@ubuntu:~/Linux_c/day03$ ./demo4.sh
input year mouth day:
2024 8 2 9 53
Today is 2024-8-2 9 53
linux@ubuntu:~/Linux_c/day03$ vi demo5.sh
​
#!/bin/bash 
​
A=`expr 3 + 5 \* 4`     #置换符不可缺省,expr是一个命令,中间空格不能少
echo $A
​
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo5.sh
linux@ubuntu:~/Linux_c/day03$ ./demo5.sh
23
​
#字符测试
linux@ubuntu:~/Linux_c/day03$ vi demo6.sh
​
#!/bin/bash 
​
A="how"
B="how"
​
test $A = $B
echo $?
​
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo6.sh
linux@ubuntu:~/Linux_c/day03$ ./demo6.sh
0
​
#整数测试
linux@ubuntu:~/Linux_c/day03$ vi demo7.sh
​
#!/bin/bash 
​
A=99
B=90
​
test $A -ne $B
echo $?
​
test $A -gt $B
echo $?
​
test $A -lt $B
echo $?
​
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo7.sh
linux@ubuntu:~/Linux_c/day03$ ./demo7.sh
0          #ne !=
0          #gt  >
1          #lt  <

3. shell脚本-分支语句

结构性语句:结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程主要包括:条件测试语句(两路分支)、多路分支语句、循环语句、循环控制语句和后台执行语句条件语句:if...then...fi
语法结构:if  表达式then 命令表fi-如果表达式为真,则执行命令表中的命令;否则退出if语句,即执行fi后面的语句-if和fi是条件语句的语句括号,必须成对使用;-命令表中的命令可以是一条,也可以是若干条if...then...else..fi
语法结构:if   表达式then 命令表达式1else 命令表2ficase...esac
语法结构:case 字符串变量 in模式1)命令表1;;模式2 | 模式3)命令表2;;...模式n)命令表n;;esac
linux@ubuntu:~/Linux_c/day03$ vi demo8.c
​
#!/bin/bash 
​
if [ $# -ne 1 ]
thenecho "usage:$0 filename"exit
fi
​
if ! [ -e $1 ]
then echo "$1 not exist"exit
fi
​
if [ -L $1 ]
thenecho "l"
elif [ -d $1 ]
thenecho "d"
elif [ -f $1 ]
thenecho "-"
elif [ -b $1 ]
elseecho "csp"
fi
​linux@ubuntu:~/Linux_c/day03$ chmod u+x demo8.sh
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh ./link1
./link1 not exist
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh /dev/ram4
b
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh demo1.sh
-
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh /etc
d
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh /dev/tty
csp
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh /home/linux1
/home/linux1 not exist
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh /home/linux
d
linux@ubuntu:~/Linux_c/day03$ ./demo8.sh
usage:./demo8.sh filename
linux@ubuntu:~/Linux_c/day03$ touch demo9.sh
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo9.sh
linux@ubuntu:~/Linux_c/day03$ vi demo9.sh
​
#!/bin/bash 
​
echo -n "please choose (yes|no)?"
read R
​
case $R inyes)echo "yes";;y)echo "yes2";;no)echo "no";;*)echo "wrong"#;;
​
esac
​
linux@ubuntu:~/Linux_c/day03$ ./demo9.sh
please choose (yes|no)?yes
yes
linux@ubuntu:~/Linux_c/day03$ ./demo9.sh
please choose (yes|no)?y
yes2
linux@ubuntu:~/Linux_c/day03$ ./demo9.sh
please choose (yes|no)?no
no
linux@ubuntu:~/Linux_c/day03$ ./demo9.sh
please choose (yes|no)?n
wrong
 

4. shell脚本-循环语句

循环语句for当循环次数已知或确定,使用for循环语句来多次执行一条或一组命令。循环体由语句括号do和done来限定。格式为:for 变量名 in 单词表do命令表done变量依次取单词中的各个单词,每取一次单词,就执行一次循环体中的命令。循环次数由单词表中的单词数确定。命令表中的命令可以是一条,也可以是由分号或换行符分开的多条如果单词表是命令行上的所有位置参数时,可以在单词表部分循环语句while语法结构:while 命令或表达式do命令表done循环控制语句 break和continuebreak n 则跳出n层continue语句转到最近一层循环语句的下一轮循环上continue n则转到最近n层循环语句的下一轮循环上
vi demo10.shchmod u+x demo10.sh
​
#!/bin/bash 
​
#for I in 1 3 5 7 9
for I in `seq 1  100`
do SUM=`expr $SUM + $I`
done
echo $SUM
​
for ((I = 1; I <= 10 ; I++))
doecho "I=$I"
done
​
linux@ubuntu:~/Linux_c/day03$ ./demo10.sh
5050
I=1
I=2
I=3
I=4
I=5
I=6
I=7
I=8
I=9
I=10
linux@ubuntu:~/Linux_c/day03$ cp demo10.sh demo11.sh
linux@ubuntu:~/Linux_c/day03$ vi demo11.sh
​
#!/bin/bash 
​
I=0
​
while [ $I -lt 5 ]
doI=`expr $I + 1`echo -n "input score:"read S
​case `expr $S / 10` in10|9)echo "A";;6|7|8)echo "B";;*)echo "C";;esacecho "$I"
done
​
linux@ubuntu:~/Linux_c/day03$ ./demo11.sh
input score:100
A
1
input score:87
B
2
input score:6
C
3
input score:72
B
4
input score:83
B
5
linux@ubuntu:~/Linux_c/day03$ touch demo12.sh
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo12.sh
linux@ubuntu:~/Linux_c/day03$ vi demo12.sh
​
#!/bin/bash 
​
I=1
while [ $I -lt 5 ]
do J=1while [ $J -lt 5 ]doJ=`expr $J + 1`if [ $J -gt 3 ]thenbreak 2fiecho "$I-$J"doneI=`expr $I + 1`
done
​
linux@ubuntu:~/Linux_c/day03$ ./demo12.sh
1-2
1-3

5. shell脚本-函数

shell函数调用格式:方式1:value_name=`function_name [arg1 arg2 ...]`方式2:function_name [arg1 arg2 ...]echo $?函数变量作用域全局作用域:在脚本的其他任何地方都能访问该变量局部作用域:只能在声明变量的作用域内访问声明局部变量的格式:Local 变量名 =值
linux@ubuntu:~/Linux_c/day03$ vi demo13.sh
linux@ubuntu:~/Linux_c/day03$ chmod u+x demo13.sh
linux@ubuntu:~/Linux_c/day03$ ./demo13.sh
input username:linux
1
linux exist
linux@ubuntu:~/Linux_c/day03$ ./demo13.sh
input username:mm
0
mm not exist

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LLM:flash-attention概述
  • 药明康德:头顶达摩克利斯之剑
  • 从C到Py:Python中的函数
  • 数仓入门:数据分析模型、数仓建模、离线实时数仓、Lambda、Kappa、湖仓一体
  • 相机拍摄如何正确曝光
  • 3个功能强大的PDF转换工具,免费试用
  • 软件系统架构设计的“三高”
  • ORA-00911: invalid character
  • 动手学大模型应用开发笔记--用dash开发一个大模型知识库
  • 网络空间资产测绘:为安全防护“画出”实时“地图”
  • SPIFFS与LittleFS的对gz文件格式的区别
  • 静态IP代理和动态IP代理的区别
  • 使用ollama分别在我的window、mac、小米手机上部署体验llama3-8b(文末有福利)
  • C++——C++11
  • 【深度学习】VITS中的条件VAE,VAE的隐变量z为何要服从正太分布(2)
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Android组件 - 收藏集 - 掘金
  • javascript数组去重/查找/插入/删除
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • js如何打印object对象
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • ReactNative开发常用的三方模块
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 复习Javascript专题(四):js中的深浅拷贝
  • 记一次用 NodeJs 实现模拟登录的思路
  • 模型微调
  • 巧用 TypeScript (一)
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 跳前端坑前,先看看这个!!
  • 优化 Vue 项目编译文件大小
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #Linux(权限管理)
  • #微信小程序:微信小程序常见的配置传值
  • (1)Android开发优化---------UI优化
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (zt)最盛行的警世狂言(爆笑)
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (六)c52学习之旅-独立按键
  • (全注解开发)学习Spring-MVC的第三天
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (四)事件系统
  • (译) 函数式 JS #1:简介
  • (原)本想说脏话,奈何已放下
  • **CI中自动类加载的用法总结
  • .Net Core缓存组件(MemoryCache)源码解析
  • .Net IOC框架入门之一 Unity
  • .net Stream篇(六)
  • .NET 回调、接口回调、 委托
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .net6使用Sejil可视化日志
  • .net快速开发框架源码分享
  • .sh
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录