Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。
Shell可以直接使用在win/Unix/Linux上面,并且可以调用大量系统内部的功能来解释执行程序,如果熟练掌握Shell脚本,可以让我们操作计算机变得更加轻松,也会节省很多时间。

Shell应用场景

Shell能做什么

  • 将一些复杂的命令简单化(平时我们提交一次github代码可能需要很多步骤,但是可以用Shell简化成一步)
  • 可以写一些脚本自动实现一个工程中自动更换最新的sdk(库)
  • 自动打包、编译、发布等功能
  • 清理磁盘中空文件夹
  • 总之一切有规律的活脚本都可以尝试一下

Shell不能做什么

  • 需要精密的运算的时候
  • 需要语言效率很高的时候
  • 需要一些网络操作的时候
  • 总之Shell就是可以快速开发一个脚本简化开发流程,并不可以用来替代高级语言

Shell的工作原理

Shell可以被称作是脚本语言,因为它本身是不需要编译的,而是通过解释器解释之后再编译执行,和传统语言相比多了解释的过程所以效率会略差于传统的直接编译的语言。


最简单的脚本:

#!/bin/bash
echo "Hello World"

只需要打开文本编辑工具,编辑成以上的样子,然后保存成test.sh

运行该脚本:

1. cd 到该目录下
2. chmod +x ./test.sh  #给脚本权限
3. ./test.sh  #执行脚本

效果图1

这样我们便写出来了第一个最简单的脚本,下面我们可以尝试着写一些复杂的脚本。


Shell中的变量

myText="hello world"
muNum=100

这里面需要注意的就是,“=”前后不能有空格,命名规则就和其它语言一样了。

访问变量

myText="hello world"
muNum=100
echo $myText
echo muNum

当想要访问变量的时候,需要使用$,否则输出的将是纯文本内容,如下图所示。

效果图2

Shell中的四则运算

运算符 含义
+ 加法运算
- 减法运算
* 乘法运算
/ 除法运算

例子程序

#!/bin/bash
echo "Hello World !"
a=3
b=5
val=`expr $a + $b`
echo "Total value : $val"val=`expr $a - $b`
echo "Total value : $val"val=`expr $a \* $b`
echo "Total value : $val"val=`expr $a / $b`
echo "Total value : $val"

这里面需要注意的就是,定义变量的时候“=”前后是不能有空格的,但是进行四则运算的时候运算符号前后一定要有空格,乘法的时候需要进行转义。

效果图3.png

其它运算符 =、==、!=、!、-o、-a

运算符 含义
% 求余
== 相等
= 赋值
!= 不相等
!
-o
-a

例子程序

a=3
b=5
val=`expr $a / $b`
echo "Total value : $val"val=`expr $a % $b`
echo "Total value : $val"if [ $a == $b ]
thenecho "a is equal to b"
fi
if [ $a != $b ]
thenecho "a is not equal to b"
fi

效果图4

关系运算符

运算符 含义
-eq 两个数相等返回true
-ne 两个数不相等返回true
-gt 左侧数大于右侧数返回true
-It 左侧数小于右侧数返回true
-ge 左侧数大于等于右侧数返回true
-le 左侧数小于等于右侧数返回true

例子程序

#!/bin/sh
a=10
b=20
if [ $a -eq $b ]
thenecho "true"
elseecho "false"
fiif [ $a -ne $b ]
thenecho "true"
elseecho "false"
fiif [ $a -gt $b ]
thenecho "true"
elseecho "false"
fiif [ $a -lt $b ]
thenecho "true"
elseecho "false"
fiif [ $a -ge $b ]
thenecho "true"
elseecho "false"
fiif [ $a -le $b ]
thenecho "true"
elseecho "false"
fi

效果图5

字符串运算符

运算符 含义
= 两个字符串相等返回true
!= 两个字符串不相等返回true
-z 字符串长度为0返回true
-n 字符串长度不为0返回true

运算符 含义
-d file 检测文件是否是目录,如果是,则返回 true
-r file 检测文件是否可读,如果是,则返回 true
-w file 检测文件是否可写,如果是,则返回 true
-x file 检测文件是否可执行,如果是,则返回 true
-s file 检测文件是否为空(文件大小是否大于0,不为空返回 true
-e file 检测文件(包括目录)是否存在,如果是,则返回 true

字符串

#!/bin/sh
mtext="hello"  #定义字符串
mtext2="world"
mtext3=$mtext" "$mtext2  #字符串的拼接
echo $mtext3  #输出字符串
echo ${#mtext3}  #输出字符串长度
echo ${mtext3:1:4}  #截取字符串

效果图6

数组

#!/bin/sh
array=(1 2 3 4 5)  #定义数组
array2=(aa bb cc dd ee)  #定义数组
value=${array[3]}  #找到某一个下标的数,然后赋值
echo $value  #打印
value2=${array2[3]}  #找到某一个下标的数,然后赋值
echo $value2  #打印
length=${#array[*]}  #获取数组长度
echo $length

效果图7

输出程序

echo

#!/bin/sh
echo "hello world"
echo hello world  text="hello world"
echo $textecho -e "hello \nworld"  #输出并且换行echo "hello world" > a.txt  #重定向到文件echo `date`  #输出当前系统时间

效果图8

printf

同c语言,就不过多介绍了


判断语句

  • if
  • if-else
  • if-elseIf
  • case
#!/bin/sh
a=10
b=20
if [ $a == $b ]
thenecho "true"
fiif [ $a == $b ]
thenecho "true"
elseecho "false"
fiif [ $a == $b ]
thenecho "a is equal to b"
elif [ $a -gt $b ]
thenecho "a is greater than b"
elif [ $a -lt $b ]
thenecho "a is less than b"
elseecho "None of the condition met"
fi

效果图9

test命令

test $[num1] -eq $[num2]  #判断两个变量是否相等
test num1=num2  #判断两个数字是否相等
参数 含义
-e file 文件存在则返回真
-r file 文件存在并且可读则返回真
-w file 文件存在并且可写则返回真
-x file 文件存在并且可执行则返回真
-s file 文件存在并且内容不为空则返回真
-d file 文件目录存在则返回真

for循环

#!/bin/sh

for i in {1..5}
doecho $i
donefor i in 5 6 7 8 9
doecho $i
donefor FILE in $HOME/.bash*
doecho $FILE
done

效果10

while循环

#!/bin/sh
COUNTER=0
while [ $COUNTER -lt 5 ]
doCOUNTER=`expr $COUNTER + 1`echo $COUNTER
doneecho '请输入。。。'
echo 'ctrl + d 即可停止该程序'
while read FILM
doecho "Yeah! great film the $FILM"
done

以上是while循环的两种用法,第一种是比较常规的,执行循环,然后每次都把控制的数加1,就可以让while循环有退出的条件了。
第二种是用户从键盘数据,然后把用户输入的文字输出出来。


跳出循环

break  #跳出所有循环
break n  #跳出第n层f循环
continue  #跳出当前循环

函数

#!/bin/sh

sysout(){echo "hello world"
}sysout

定义一个没有返回值的函数,然后调用该函数

#!/bin/sh

test(){aNum=3anotherNum=5return $(($aNum+$anotherNum))
}
test
result=$?
echo $result

定义一个有返回值的函数,调用该函数,输出结果

效果图11
#!/bin/sh

test(){echo $1  #接收第一个参数echo $2  #接收第二个参数echo $3  #接收第三个参数echo $#  #接收到参数的个数echo $*  #接收到的所有参数
}test aa bb cc

定义了一个需要传递参数的函数

效果图12

重定向

$echo result > file  #将结果写入文件,结果不会在控制台展示,而是在文件中,覆盖写
$echo result >> file  #将结果写入文件,结果不会在控制台展示,而是在文件中,追加写
echo input < file  #获取输入流

写一个自动输入命令的脚本

自动提交github仓库的脚本

#!/bin/bash
echo "-------Begin-------"
git add .
git commit -m $1
echo $1
git push origin master
echo "--------End--------"

一篇文章学懂Shell脚本相关推荐

  1. 一篇文章学懂Shell脚本,最简明的教程在这里

    Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. Shell可以直接使用在win/Unix/Linux上面 ...

  2. 一篇文章学懂数据结构中的树

    1.树知识体系搭建 2.树的基础知识 2.1 关于树结构 树形结构是非常重要的非线性结构,是以分支关系定义的一对多的层次结构. 树是n(n≥0)个结点的有限集.当n=0时,称为空树.在任意一棵非空树中 ...

  3. 一篇文章看懂:量化交易

    什么是量化交易? 度娘官方版 - 理论这么说 量化交易是指以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种"大概率"事件以制定策略,极大 ...

  4. 计算机论文章节构成,一篇文章弄懂电脑的组成

    原标题:一篇文章弄懂电脑的组成 来源:转载于网络:学电脑知识http://www.pc280.com 今天为大家全面介绍电脑的组成,看完这个你一定再也不会对这个铁盒子产生畏惧,一定让你理解,让你懂! ...

  5. 一篇文章看懂@Scheduled定时器/@Async/CompletableFuture

    一篇文章看懂@Scheduled定时器/@Async/CompletableFuture @Scheduled注解解析: 1.cron:最重要的一个参数 cron表达式[秒] [分] [小时] [日] ...

  6. 一篇文章读懂MySQL的各种联合查询

    一篇文章读懂MySQL的各种联合查询 联合查询是指将两个或两个以上的表的数据根据一定的条件合并在一起! 联合查询主要有以下几种方式: 全连接:将一张表的数据与另外一张表的数据彼此交叉联合查询出来 举例 ...

  7. c++ 计算正弦的近似值_一篇文章搞懂正弦保真性

    本文介绍数字信号处理中"正弦保真性"这一概念,想要更好地理解本文所述内容,建议读者先阅读<一篇文章搞懂卷积>. 正弦保真性定义 一个正弦信号作为线性时不变系统的输入时, ...

  8. c++ socket线程池原理_一篇文章看懂 ThreadLocal 原理,内存泄露,缺点以及线程池复用的值传递问题...

    编辑:业余草来源:https://www.xttblog.com/?p=4946 一篇文章看懂 ThreadLocal 原理,内存泄露,缺点以及线程池复用的值传递问题. ThreadLocal 相信不 ...

  9. 一篇文章搞懂filebeat(ELK)

    一篇文章搞懂filebeat(ELK) https://www.cnblogs.com/zsql/p/13137833.html 目录 一.filebeat是什么 1.1.filebeat和beats ...

最新文章

  1. linux 安装jdk1.8 rpm包
  2. 报名 | AI Time :论道AI安全与伦理
  3. Pytorch的backward()相关理解
  4. html文件头自动生成,基于infinispan源码包HtmlGenerator代码生成器通过指定头部、标题、底部等进行生成HTML文件...
  5. SAP License:CO-FI实时集成
  6. MFC消息映射及消息处理函数原型
  7. 【Django 2021年最新版教程21】数据库查询 model 多条数据 queryset转dict字典 返回渲染到前端
  8. android contacts 源码分析,MTK Contacts代码分析
  9. win 10如何删除OEM分区
  10. 通过阿里云api获取ecs主机信息
  11. 微信小程序消息订阅超详细流程步骤
  12. OAuth 2.0 基础(2)
  13. 酒店无线wifi覆盖方案
  14. 如何快速提高网站权重?
  15. 2022年首个退役的Apahce大数据项目
  16. matlab脚本文件和函数文件
  17. Mac 安装 Truffle 和 Ganache
  18. 2022年NOC软件创意编程(学而思赛道)决赛小学初中组python
  19. Symbian 百科
  20. linux 7 内核崩溃重启,centos7无故重启-内核升级

热门文章

  1. 8. 进制转化的函数
  2. Atitit.软件兼容性原理与实践 v3 q326.docx
  3. 顺序表应用6:有序顺序表查询
  4. C++ STL:stack和queue
  5. 在VS下用C语言连接SQLServer2008
  6. 【C++】重载运算符(二)
  7. mysql 压力测试脚本
  8. 计算程序运行时间(time_t, clock_t)
  9. FFmpeg中一个线程获取视频流一个线程执行scale测试代码
  10. 对象检测工具包mmdetection简介、安装及测试代码