一篇文章学懂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 ]
thenecho "a is equal to b"
fi
if [ $a != $b ]
thenecho "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 ]
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

字符串运算符
运算符 | 含义 |
---|---|
= | 两个字符串相等返回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 $textecho -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 ]
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

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

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
定义一个有返回值的函数,调用该函数,输出结果

#!/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--------"

相关文章:

OC系列foundation Kit基础-NSDate
一.获取当前时间 1.1创建一个日期对象 NSDate *date [NSDate date];NSLog("%",date);输出结果: 2016-07-01 17:31:02.410 OCString[907:402963] 2016-07-01 09:31:02 0000 //因为时区不一样,需要格式化为本地时间 Program ended with exit…

sql server 中将由逗号“,”分割的一个字符串,转换为一个表,并应用与 in 条件...
select * from tablenmae where id in(1,2,3) 这样的语句和常用,但是如果in 后面的 1,2,3是变量怎么办呢,一般会用字符串连接的方式构造sql语句 string aa"1,2,3";string sqltxt"select * from tablename where id…

Nmap安装和扫描(一:Nmap安装和扫描基础知识点总结)
实验目的及要求 完成VMware Workstations14平台安装,会应用相关操作;完成Windows 7操作系统及Kali Linux操作系统的安装;掌握安全扫描的概念、意义及应用分析;掌握Nmap扫描器的安装;针对特定扫描目的,掌握…

最新最全的 Android 开源项目合集(一)
原文链接:https://github.com/opendigg/awesome-github-android-ui 抽屉菜单 MaterialDrawer ★7337 - 安卓抽屉效果实现方案 Side-Menu.Android ★3865 - 创意边侧菜单 FlowingDrawer ★1744 - 向右滑动流动抽屉效果 SlidingRootNav ★1338 - 仿DrawerLayout的View…

dotNet core Windows上 部署
转载于:https://www.cnblogs.com/yiyanwannian/p/5637896.html

HDU 1061 Rightmost Digit
解题报告:1097的翻版,求 N^N 次方的个位是多少? 详见我的另一篇HDU 1097 A hard puzzle稍加修改就行 1 #include<cstdio>2 int main( ) {3 int xh[20],n,a,N,T;4 scanf("%d",&T);5 while(T--) {6 sc…

Nmap安装和扫描(二:Nmap基本操作)
任务二、选择和排除扫描目标 2.1、使用-iR随机扫描3台主机 注:为了减少扫描时间,仅限于在80端口上扫描 2.2、扫描主机排除指定IP 注:扫描192.168.43.0/24网段的主机但排除192.168.43.11主机 2.3、扫描主机排除指定地址列表文件中的IP 2.3.…

npoi导出execl源码,vs2008实现,包括using库
该链接有导入,导出源码,我的代码有下链接改写,完善而成的, http://www.cnblogs.com/colder/p/3611906.html using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using Syste…

最初的梦想,将来的你一定会感谢现在努力的自己
现在凌晨零点三十八分,我刚挂了电话,与我的好姐妹。 她拨通电话就兴奋的问:“你猜我在哪里?”我睡得迷迷糊糊的说:“香港!”她呵呵的笑,说:“No!我在美国!” 我一下子呆住了,问:“国…
iOS架构设计-URL缓存(上)
转载自崔江涛(KenshinCui) http://www.cnblogs.com/kenshincui/p/iOS-jia-gou-she-jiURL-huan-cun.html 概览 缓存组件应该说是每个客户端程序必备的核心组件,试想对于每个界面的访问都必须重新请求势必降低用户体验。但是如何处理客户端缓存…

Web漏洞扫描(一:利用WVS进行漏洞扫描)
任务一、利用WVS进行漏洞扫描 1.1、Acunetix WVS 的下载与安装; 1.1.1、WVS的安装(按照图中的指示执行); 1.1.2、勾选“Create a desktop shortcut”创建桌面图标,然后点击“Next”,选择“Install”&#…
iOS架构设计-URL缓存(下)
本文转载自崔江涛(KenshinCui) 缓存设计 从前面对于URL Loading System的分析可以看出利用NSURLProtocol或者NSURLCache都可以做客户端缓存,但是NSURLProtocol更多的用于拦截处理,而且如果使用它来做缓存的话需要自己发起请求。而…

pyqt4+chatterbot实现简单聊天机器人程序
环境window10python3 代码:github.com/xie233/text_mining转载于:https://www.cnblogs.com/who-a/p/5641738.html
OpenGL进阶(十三) - GLSL光照(Lighting)
提要 在上一篇文章中,我们介绍了简单的Shading,同时提出了一个光照模型,模拟了一个点光源,但是,关于光的故事还没有结束... 今天要学习的是方向光源(Directional Light),聚光灯&…

Web漏洞扫描(二:Windows server2008 R2操作系统(部署dvwa))
在Windows server 2008 R2系统中部署dvwa; 1、在Windows server 2008虚拟机中配置IIS; 1.1、打开服务器管理器,角色,添加角色,然后点击下一步; 1.2、选择安装“Web 服务器(IIS)”,…

[iOS]调和 pop 手势导致 AVPlayer 播放卡顿
作者 NewPan 关注 2017.07.15 14:24* 字数 3110 阅读 749评论 8喜欢 17声明:我为这个框架写了四篇文章: 第一篇:[iOS]UINavigationController全屏pop之为每个控制器自定义UINavigationBar 第二篇:[iOS]UINavigationController全屏…

Cocos2d-x学习笔记(三十)之 游戏存档
游戏中的存档功能可以保证玩家在游戏过程中有足够的延续性,这点在单机游戏开发中尤为重要。Cocos2D-x中支持的游戏存档类CCUserDefault可以作为一个轻量化的数据库来使用。它支持存储的数据类型包括bool(布尔型)、int(整型&#x…

github删除文件夹
git rm -rf dirgit add .git commit -m remove dirgit push origin master //dir是要删除的文件夹路径转载于:https://www.cnblogs.com/xulei1992/p/5650399.html

Web漏洞扫描(三:Burp Suite的基本操作)
任务二、Burp Suite基础Proxy功能; 2.1、在Kali虚拟机中打开Burp Suite工具并设置,打开“Proxy”选项卡,选中“Options”子选项卡,单机“Add”按钮,增加一个监听代理,设置为127.0.0.1:8080; 2.…
UITableView嵌套WKWebView的那些坑
最近项目中遇到了一个需求,TableView中需要嵌套Web页面,我的解决办法是在系统的UITableViewCell中添加WKWebView。开发的过程中,遇到了些坑,写出来分享一下。 1.首先说一下WKWebView的代理方法中,页面加载完成后会走的…

深入了解line-height
1.定义 行高:两行文字baseline(基线)之间的距离 示意图: 2.为何line-height可以让单行文本垂直居中 其实并没有垂直居中,除非将font-size:0; 3.line-height的高度原理(可以先看看行内盒子的原理) * 行内元素的高度是lin…

实现一个简单的投票功能
实现一个简单的投票功能 最近项目中需要用到一个投票功能,当时觉得简单,向都没想就动手开始做,没想到走了不少弯路。 后来才发现,是想的太过简单了。来看看改进后的功能。 第一步:数据库设计 两个表:一个主…

Web漏洞扫描(四:知识点及错误总结)
WVS软件: WVS(Web Vulnerability Scanner)是一个自动化的Web应用程序安全测试工具,它可以扫描任何可通过Web浏览器访问的和遵循HTTP/HTTPS规则的Web站点和Web应用程序。适用于任何中小型和大型企业的内联网、外延网和面向客户、雇员、厂商和其它人员的W…
【VS开发】【智能语音处理】Windows下麦克风语音采集
简介 这是我很早以前的大学毕业设计,忽然间找到贴出来以纪念自己的纯真年代...但是因为CSDN不给面子所以导致短短的一篇文章贴了足足7次..他老提时说文章超过了64K,老大,拜托,那是算上了里面的图片大小吧...:-( 本文简单介绍了声卡的工作原理 , 录音的原理以及数字音频的基本知…

iOS音频——AudioToolbox
一、前言 二、音频文件Audio File Services 三、音频文件转换Extended Audio File Services 四、音频流Audio File Stream Services 五、音频队列Audio Queue Services 一、前言 AudioToolbox提供的API主要是C 使用起来相对晦涩,针对本文提供了简单的代码示例减小学…

【WA】九度OJ题目1435:迷瘴
题目描述: 通过悬崖的yifenfei,又面临着幽谷的考验——幽谷周围瘴气弥漫,静的可怕,隐约可见地上堆满了骷髅。由于此处长年不见天日,导致空气中布满了毒素,一旦吸入体内,便会全身溃烂而死。幸好y…

云端应用SQL注入攻击
实验目的及要求: 完成VMware Workstations14平台安装,会应用相关操作;完成Windows server2008R2操作系统及Kali Linux操作系统的安装;掌握SQLmap攻击工具的使用;使用SQLmap对目标站点进行渗透攻击; 实验环…

SPOJ375(树链剖分)
题目:Query on a tree 题意:给定一棵树,告诉了每条边的权值,然后给出两种操作: (1)把第i条边的权值改为val (2)询问a,b路径上权值最大的边 分析:本题与HDU3966差不多,区别就是&#…

简单的python服务器程序
一个接受telnet输入的服务器端小程序 #!/usr/local/bin/python3.5 #coding:utf-8 import sockethost port 51423s socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((host, port)) s.listen(1)print(S…

iOS:一句代码实现文本输入的限制
前言 实际开发中,往往需要处理UITextView、UITextField输入的限制。比如输入必须是价格格式(一个小数点、小数点后面最多两位);输入最大长度限制;对输入内容的实时回调。处理这些的时候,我们通常需要做一些…