一篇文章让你快速入门 学懂Shell脚本
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 #执行脚本

这样我们便写出来了第一个最简单的脚本,下面我们可以尝试着写一些复杂的脚本。
Shell中的变量
myText="hello world"
muNum=100
这里面需要注意的就是,“=”前后不能有空格,命名规则就和其它语言一样了。
访问变量
myText="hello world"
muNum=100
echo $myText
echo muNum
当想要访问变量的时候,需要使用$,否则输出的将是纯文本内容,如下图所示。

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

其它运算符 =、==、!=、!、-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 ]
then
echo "a is equal to b"
fi
if [ $a != $b ]
then
echo "a is not equal to b"
fi

关系运算符
| 运算符 | 含义 |
|---|---|
| -eq | 两个数相等返回true |
| -ne | 两个数不相等返回true |
| -gt | 左侧数大于右侧数返回true |
| -It | 左侧数小于右侧数返回true |
| -ge | 左侧数大于等于右侧数返回true |
| -le | 左侧数小于等于右侧数返回true |
例子程序
#!/bin/sh
a=10
b=20
if [ $a -eq $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -ne $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -gt $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -lt $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -ge $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -le $b ]
then
echo "true"
else
echo "false"
fi

字符串运算符
| 运算符 | 含义 |
|---|---|
| = | 两个字符串相等返回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} #截取字符串

数组
#!/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

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

printf
同c语言,就不过多介绍了
判断语句
- if
- if-else
- if-elseIf
- case
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
echo "true"
fi
if [ $a == $b ]
then
echo "true"
else
echo "false"
fi
if [ $a == $b ]
then
echo "a is equal to b"
elif [ $a -gt $b ]
then
echo "a is greater than b"
elif [ $a -lt $b ]
then
echo "a is less than b"
else
echo "None of the condition met"
fi

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}
do
echo $i
done
for i in 5 6 7 8 9
do
echo $i
done
for FILE in $HOME/.bash*
do
echo $FILE
done

while循环
#!/bin/sh
COUNTER=0
while [ $COUNTER -lt 5 ]
do
COUNTER=`expr $COUNTER + 1`
echo $COUNTER
done
echo '请输入。。。'
echo 'ctrl + d 即可停止该程序'
while read FILM
do
echo "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=3
anotherNum=5
return $(($aNum+$anotherNum))
}
test
result=$?
echo $result
定义一个有返回值的函数,调用该函数,输出结果

#!/bin/sh
test(){
echo $1 #接收第一个参数
echo $2 #接收第二个参数
echo $3 #接收第三个参数
echo $# #接收到参数的个数
echo $* #接收到的所有参数
}
test aa bb cc
定义了一个需要传递参数的函数

重定向
$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知识的总结,欢迎大家点心,评论,一起讨论~~
原文链接:https://www.jianshu.com/p/71cb62f08768
一篇文章让你快速入门 学懂Shell脚本的更多相关文章
- 一篇文章学懂Shell脚本
Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合.Shell可以直接使用在win/Unix/Linux上面, ...
- 一篇文章学懂Shell脚本,最简明的教程在这里
Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. Shell可以直接使用在win/Unix/Linux上面 ...
- 一篇文章带你快速入门createjs
开始用createjs这个框架的时候,发现网上的相关教程还是挺少的,所以写一篇文章,方便日后查看. createjs简介 官网:http://www.createjs.cc/ createjs中包 ...
- 【转载】Gradle学习 第九章:Groovy快速入门
转载地址:http://ask.android-studio.org/?/article/17 To build a Groovy project, you use the Groovy plugin ...
- 一篇文章图文并茂地带你轻松学完 JavaScript 设计模式(一)
JavaScript 设计模式(一) 本文需要读者至少拥有基础的 ES6 知识,包括 Proxy, Reflect 以及 Generator 函数等. 至于这次为什么分了两篇文章,有损传统以及标题的正 ...
- 一篇文章图文并茂地带你轻松学完 JavaScript 设计模式(二)
JavaScript 设计模式(二) 本篇文章是 JavaScript 设计模式的第二篇文章,如果没有看过我上篇文章的读者,可以先看完 上篇文章 后再看这篇文章,当然两篇文章并没有过多的依赖性. 5. ...
- 一篇文章让你马上入门Hibernate
在前面我们学完了Struts2,接下来我们就要去学习第二个框架Hibernate. 那什么是Hibernate? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对 ...
- 【转载】Gradle学习 第七章:Java快速入门
转载地址:http://ask.android-studio.org/?/article/22 7.1. The Java plugin(Java插件) As we have seen, Gradle ...
- 一篇文章图文并茂地带你轻松学完 JavaScript 继承
JavaScript 继承 在阅读本文章之前,已经默认你了解了基础的 JavaScript 语法知识,基础的 ES6 语法知识 . 继承种类 简单的继承种类可以分为 构造函数继承 原型链继承 clas ...
随机推荐
- cookie加密
Cookie中的数据以文本的形式存在客户端计算机,考虑它的安全性,最好在将数据存入Cookie之前对其进行加密. 加密的方法很多,比较简单一点的有:Base64,md5,sha等,而相对比较复杂一点的 ...
- 走了很多弯路的CCScrollView
最近在学习Cocos2d-x,学习CCScrollView的时候走了很多弯路,决定记录下来. 学习cocos2d-x的最大的困惑就是资料不是很齐全,网上有很多资料,但是版本差异大,其次深度低,讲解不够 ...
- Tkinter Label(标签)
Tkinter Label : 这个小工具,实现了显示框,在那里你可以把文本或图像.这个widget中显示的文本可以在任何时候你想要更新. 这个小工具,实现了显示框,在那里你可以把文本或图像. ...
- ansible自动化运维工具使用详解
一. ansible 简介 1. ansible ansible是新出现的 自动化 运维工具 , 基于Python研发 . 糅合了众多老牌运维工具的优点实现了批量操作系统配置.批量程序的部署.批量运行 ...
- django之全文检索
全文检索 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理 haystack:django的一个包,可以方便地对model里面的内容进行索引.搜索,设计为支持wh ...
- python的socket编程之udp编程
在上篇文章中,仅仅讲述了如何进行了TCP编程,在本章中,将讲述使用udp进行编码,先看如下的代码,服务器端: root@python 513]# cat serverudp.py #!/usr/bin ...
- 关于电机驱动扩展板 L293D 马达板Arduino
注意端口3,4,5,6,7,8,9,10,11,12会被占用(板子上的pin口). 通过 MS_DCMotor motor(4); 中的4指的是4号电机,同理还有1-3号电机.不是pin口 舵机用 ...
- Markdown之表格的处理
目前编辑器不支持表格,以往是通过截图,呈现的效果并不好,Markdown支持html,所以我们可以用html来写表格.但是......用html写表格,实在太麻烦了,这里有个简单的转换方法,供大家参考 ...
- 利用Fiddler对Android模拟器网络请求进行抓包
安装使用Fiddler 下载安装Fiddler的方法这里就略过了,一路Next就行了.装好之后运行软件,正常情况这个时候我们已经可以对电脑的网络请求进行抓包了.Fiddler默认的代理地址是127.0 ...
- Spring在代码中获取bean的几种方式(转)
获取spring中bean的方式总结: 方法一:在初始化时保存ApplicationContext对象 ApplicationContext ac = new FileSystemXmlApplica ...