系统集成08-使用Shell脚本

系统集成08-使用Shell脚本

1 Shell基础介绍

  1. Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口
  2. Shell将用户输入的命令并且把它们送到内核去执行,然后返回执行结果
  3. Shell是可编程的,它允许用户编写由Shell命令组成的程序

查看系统默认安装的shell:

cat /etc/shells

1.1 shell脚本

在Unix/Linux里,一个程序/命令只做好一件事,复杂的问题可以通过多个命令的组合来解决, 形式最简单的Shell脚本就是一系列命令构成的可执行文件,并可以被其他脚本复用

shell脚本的执行

对于脚本文件,我们有两种执行方式:

  • sh script_name.sh
  • ./script_name.sh

如果某个Shell脚本可执行,则可以通过在命令行中输入其名称调用, 被成功调用的前提是,脚本所在路径包含在$PATH变量中

echo $PATH	#查看&PATH变量
PATH=$PATH:/New/path	#修改PATH变量
echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/New/path 	#查找具体某个命令/脚本的路径

后台执行:

当前命令行界面存在则会一直执行:

./my_script.sh &

当前命令行界面不存在也会一直执行:

nohup ./my_script.sh &

2 Shell编程基础

Linux中的文本流

文本流存在于Linux的每一个进程中. Linux的每个进程启动时,会打开三个文本流的端口:标准输入、标准输出、标准错误, 这三个端口对应着一个程序的输入、输出和异常的抛出

输出重定向

某些情况下,我们需要保存程序的输出,此时就可以通过重定向,将程序的输出保存到文件中

  1. 将标准输出定向到文件中(覆盖):

    ls>dir_log
    
  2. 将标准输出追加到文件中:

    ls>>dir_log
    

输入重定向

与输出重定向类似,输入重定向是把程序的标准输入进行重新定向

  1. 输入重定向:

    command<inpuptfile
    

    将右边的文件作为标准输入,然后传入左边的命令

  2. 内联输入重定向:

    command<<marker
    

    输出重定向需要文件,而内联输入重定向可以使用即时输入的文本作为标准输入,传入左边的命令, “marker”作为标志,表示标准输入的开始和结束,自身不包含在标准输入里

管道

有时需要将一个命令的输出连到另一个命令的输入,如果用重定向实现会较复杂,管道(|)就像现实中的水管一样,可以连接两个命令的输入和输出,甚至是串联多个命令

管道实际上是进程间通信(IPC)的一种方式

command1 | command2 | command3

Shell中的字符

和其他编程语言一样,Shell也有一些保留字(特殊字符),在编写脚本时需要注意

字符 说明
# 注释
' 字符串引用
\ 转义
/ 路径分隔
! 反逻辑

变量

  1. 在LinuxShell中,变量主要有两大类:

    • 环境变量
    • 用户定义变量
  2. 每种类型的变量依据作用域不同,又分为全局变量和局部变量

    • 全局变量作用在整个Shell会话及其子Shell
    • 局部变量作用在定义它们的进程及其子进程内
  3. 查看变量

    • 使用printenv查看全局变量
    • 使用set查看某个特定进程中的所有变量,包括局部变量、全局变量以及用户定义变量
  4. 修改变量

    • 在.bash_profile或.bashrc中添加export语句,永久修改变量
  5. 使用变量:

    • 变量命名规则:
      • 变量名由数字、字母、下划线组成
      • 必须以字母或者下划线开头
      • 不能使用Shell里的关键字

扩展变量

在以下示例中,如果不使用花括号,Bash会将$FIRST_$LAST解释为变量$FIRST_后跟变量$LAST,而不是由_字符分隔的变量$FIRST和$LAST

变量的赋值与输出

name=Euler
time=‘2020202’
echo “My nameis $name,today is
$time”
read name
echo “Hello, $name, welcome!”

条件语句

if command
	then
	commands
fi

多分支判断语句

case variable in
	pattern1 | pattern2) commands1;;
	pattern3) commands2;;
	*) default commands;;
esac

循环语句

for:

for var in list
	do
		commands
	done

while:

sum=0; i=1
while((i<=100))
do
	let"sum+=i"
	let"i+=2"
done
	echo "sum=$sum"
本文转载于网络 如有侵权请联系删除

相关文章

  • 示例:Netty 处理 TCP数据分包协议

    大家好,又见面了,我是全栈君。一个、Netty解决TCP协议的数据分包的想法我们知道通过TCP协议发送接收数据时,假设数据过大。接收到的数据会是分包的。比方: +—–+—–+—–+ 发送数据是:|ABC|DEF|GHI| +—–+—–+—–+而我们想接受到的数据是:|ABCDEFGHI|该怎样处理这样的情况呢?Netty提供了一个专门处理TCP协议数据的Handler: LengthFieldBasedFrameDecoder,它的原理是server端和client约定一个协议格式:数据包=协议长度+协议体——————————–数据包—————————— |协议长度部分(接收数据长度)|协议体部分(要接收的数据)|举个样例,假如我们的TCPclient发送了10MB字节的数据,怎样让Nettyserver一次就接收到这10MB数据呢?那就须要client告诉服务端我发送的数据大小是多少,即在发送的数据中增加一个“数据包长度”就可以,上面提到的Handler就是用来和client约定这个协议格式的,它有几个參数,以下我介绍一下它的參数意义: int maxFrameLength:定义接收

  • Mongodb单点部署

    一.依赖和环境centos7.2,4核cpu,8G内存100G硬盘 版本:3.4.7社区版本 端口:27017 数据目录:/usr/local/mongodb/data/mongodb 配置文件:/usr/local/mongodb/data/mongodb.conf二.部署1.下载3.4.7版本 wgethttp://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.7.tgz?_ga=2.27332668.129100306.1533718841-1981701661.15337188412.改名并移动 mvmongodb-*mongodb.tgz tar-xfmongodb.tgz mvmongodb-linux-x86_64-rhel70-3.4.7/usr/lcoal/mongodb chmod+x/usr/local/mongodb/bin/*3.添加环境变量 vim/etc/profileexportPATH=/usr/local/mongodb/bin:$PATHsource/etc/profile4

  • ASP.NET中的事务处理和异常处理

    刘彦青编译来自:yesky使用SQL-Transaction类和.NET提供的异常处理机制,我们就能够以一种可靠的方式处理数据库运行中的问题和发现系统异常。这篇小文章将解释事务处理和异常处理的概念和用法。什么是事务? 事务处理是由以一个单一的逻辑单位完成的一系列操作,它可以由一系列的SQL语句、SELECT、INSERT、UPDATE、DELETE组成,如果在该单位包含的操作执行完毕后没有发生错误,那么它对数据库所作的改变就是永久的了。如果一旦有错误发生,它就不会对数据库作任何修改或改变。要定义一个事务,需要使用Begintran命令,在这一命令之后的任何语句都将被认为是事务的一部分。命令Commit用来完成事务,并使事务对数据库所作的修改成为永久的。Rollback命令用来取消一个事务,并还原事务对数据库所作的修改。下面是一个事务的例子:[SQLSERVER7.0orSQLSERVER2000] BEGINTRAN INSERTINTOPRODUCT(PRODUCTID,PRODUCTNAME)VALUES("0001","KEYBOARD"

  • 性能工具之Jmeter通过springboot工程启动

    背景Jmeter平时性能测试工作一般都是通过命令行在linux下执行,为了锻炼自己代码与逻辑能力,想jmeter是否可以通过springboot工程启动,周末在家尝试写一写,一写原来需要处理很多事情,才可以启动起来,起来还是有很问题需要处理,下面是相应的代码,其实网上也有,但关键的是自己有意识收集知识,到用的时候能拿来改一改就用。 启动页面: 前置条件需要在linux中配置Jmeter成功,并且配置环境变量: 环境配置: 编辑: vi~/.bash_profile #jmeter:路径根据自己事情情况修改 JMETER_HOME=/root/tools/apache-jmeter-5.1.1 PATH=$PATH:$HOME/bin:$JMETER_HOME/bin: exportPATH 执行生效: source~/.bash_profile 点击上传脚本,弹出对话框,点击上传,后台日志显示上传成功:点击启动:并且读取启动日志点击停止: 上面脚本停止图画说明: 通过访问--》调用java代码--》启动shell命令--》启动jmeter-获取启动日志前端代码以下参考代码,大家可以

  • Centos7下安装redis实战(单机版以及集群)

    一、背景  因项目需要,要引入redis做缓存,就在centos7下亲自安装了一遍redis,刚好趁着这个机会就来把redis的概念以及单机版和集群版redis安装步骤记录下来,在此和大家一起分享。二、Redis介绍1.什么是Redis?  Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型有:字符串类型、散列类型、列表类型、集合类型、有序集合类型。2.Redis的应用场景:     缓存(数据查询、短连接、新闻内容、商品内容等等);(最多使用)   分布式集群架构中的session分离;   聊天室的在线好友列表;   任务队列;(秒杀、抢购、12306等等)   应用排行榜;   网站访问统计;   数据过期处理(可以精确到毫秒).三、安装前准备1.因为redis是C语言开发的,所以我们建议在linux上运行,故本文介绍在centos7上安装redis.2.安装redis需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,

  • 区块链101:比特币可以扩展吗?

    几年后,中本聪(SatoshiNakamoto)发布了自己的比特币论文,比特币的用户开始注意到一个潜在的问题:比特币不是很有流动性。对于一个声称可以取代菲亚特支付的系统来说,这是一个巨大的障碍。尽管Visa处理的交易数量约为2.4万次,但比特币可以达到7倍。除非能做点什么,否则比特币的效用是有限的。由此开始了“规模争论”,这一争论使社会两极分化,并掀起了一波技术革新的浪潮,寻找变通方法。然而,虽然取得了重大进展,但可持续的解决方案仍远未明朗。这个问题源于比特币的设计:Satoshi设计了一个大小限制为1MB的积木,以防止网络垃圾。由于每个块平均需要10分钟的时间来处理,所以总的来说,这是一个相对较少的事务。需求的增加必然会导致费用的增加,而比特币的效用将进一步降低。不这么认为一个简单的解决方案最初似乎是增加了块大小。然而,这个想法其实并不简单。首先,没有明确的协议应该增加多少。有些提议提倡2MB,另一些则支持8MB,一个想要高达32MB。核心开发团队认为,增加区块规模将会削弱该协议的分散化,因为它集中了采矿力量——有更大的区块,只有更强大的矿商才会成功,而更快的机器的竞争最终可能会使比

  • 谷歌工智能开源项目Tensorflow预示着硬件领域的重大变革

    谷歌宣布将其最重要的创新项目之一——人工智能引擎——作为开源项目发布到网上供大家免费使用,这展示了计算机软件行业正进行着什么样的变革。最近,互联网巨头们接二连三地将自己线上核心业务所用的软件开源。项目开源加快了技术发展的进程。随着人工智能引擎TensorFlow的开源,谷歌能以各种方式为公司范围之外的机器学习研究提供支持,这些研究成果也将反馈给谷歌。不过谷歌的人工智能引擎也反映了当今计算机硬件行业的发展趋势。在谷歌内部,处理图像识别、语音识别和语言翻译等任务时,TensorFlow依赖于配备图像处理单元(GPU)的机器,和被用于渲染游戏图像的芯片等,但对其它的任务也擅长。它对这些芯片的依赖比想象中的更多。根据负责谷歌AI项目的工程师JeffDean的说法,谷歌不仅用GPU训练其AI服务,而且还运行这些服务产品——将它们植入用户手中的智能电话。那是一次重大的转变。目前,Facebook在其庞大的计算机数据中心里用GPU训练人脸识别模型,但在为用户提供服务时——真刀实战地在社交网站上识别人脸——还是使用传统的处理器,或者CPU。Facebook的CTOMike“Schrep”Schroep

  • jedis连接redis集群中的一台无法操作?_jedis连接redis哨兵

    大家好,又见面了,我是你们的朋友全栈君。<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>复制spring: redis: password:123456 database:0 cluster: nodes: -192.168.119.101:6111 -192.168.119.101:6112 -192.168.119.101:6113 -192.168.119.101:6114 -192.168.119.101:6115 -192.168.119.101:6116 maxAttempts:3 password:mypassword jedis: pool: max-active:1000 max-idle:10 max-wait:-1 min-idle:5 timeout:6000复制@Data @Configuration @ConfigurationProperties(pref

  • 1.爬虫 urlib库讲解 Handler高级用法

    在前面我们总结了urllib库的urlopen()和Request()方法的使用,在这一小节我们要使用相关的Handler来实现代理、cookies等功能。 写在前面: urlopen()方法不支持代理、cookie等其它的HTTP/GTTPS高级功能,所以要支持这些功能: 使用相关的Handler处理器来创建特定功能的处理器对象 然后调用urllib.request.build_opener()方法使用这些处理器对象,创建自己的opener对象 使用自定义的opener对象,调用open()方法发送请求 *如果程序里所有的请求都使用自定义的opener,可以使用urllib.request.install_opener()将自定义的opener对象定义为全局的opener,表示如果之后凡是调用urlopen(),都将使用这个opener   简单介绍下request模块里的相关的Handler类:(我们暂且只会用到3种,需求够了就ok) ProxyHandler:用于设置代理,默认代理为空 HTTPCookieProcessor:用于处理Cookies HTTPBas

  • 八卦Knuth

    【以下文字转载自TeX讨论区】发信人:helloooo(花生),信区:TeX标题:八卦Knuth(1)发信站:BBS水木清华站(TueOct722:47:302003),转信复制 现在我开始当娱乐记者:)从今天开始8gKnuth老爹传说Knuth写书写文章的第一稿都是用铅笔写的。很多人不明白他为什么不用键盘。其实原因是这样,Knuth曾经参加过一个训练小秘的学习班,练习打字每分钟80个词以上。到了后来,他发现他打字的速度大大高于他思考的速度,所以如果他用键盘,就会出现很多停顿。所以他决定用铅笔,这样可以与读者的思考速度保持一致。八卦Knuth(2)Knuth作为一个计算机科学家,为什么放下他所有的工作10年,专心研究排版美学,创造TeX系统。这是很奇怪的一件事情。其实原因是这样。真正完美的数学排版应该是用金属活字进行的。但是自从70年代以来,真正懂得这项技术的人都死光了。新的排版机器,很不幸的都被计算机操纵了(想想Matrix)。虽然当时计算机能够排出一些简单的报纸,杂志,但是它们不能很好的处理数学公式。Knuth想写出一个小玩艺儿能够在不同的计算机上制造漂亮的数学公式,于是TeX(读

  • 菜鸟nginx源码剖析数据结构篇(十一) 共享内存ngx_shm_t[转]

    菜鸟nginx源码剖析数据结构篇(十一)共享内存ngx_shm_t   Author:EchoChen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:Nov14th,2014   1.共享内存 共享内存是Linux下提供的最基本的进程通信方法,它通过mmap或者shmget系统调用在内存中创建了一块连续的线性地址空间,而通过munmap或者shmdt系统调用释放这块内存,使用共享内存的好处是多个进程使用同一块内存时,在任何一个进程修改了共享内存中的内容后,其它进程通过访问这段内存就能够得到内存变化。 2.源代码位置   头文件:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_shmtx.h 源文件:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_shmtx.c   3.数据结构定义 ngx_shm_t:用

  • 微信小程序首页的上一个页面栈和当前页面栈

    我们在微信小程序开发页面栈获取上会有两种诉求 1.获取当前页面栈 2.获取上一个页面栈 获取当前页面栈 其实这个就比较简单,当前页面最好获取,而且微信官网文档也提供了API https://developers.weixin.qq.com/miniprogram/dev/reference/api/getCurrentPages.html 注意: 不要尝试修改页面栈,会导致路由以及页面状态错误。 不要在App.onLaunch的时候调用getCurrentPages(),此时page还没有生成。 //获取当前页面路径 exportconstgetCurrentPageUrl=()=>{ return`/${getCurrentPages()[getCurrentPages().length-1].route}` } 复制 获取上一个页面栈 这个有两种情况需要考虑 1.如果是当前页面是非首页,我们可以很容易获取到 2.如果是在首页获取上个页面栈就需要用隐藏APIwx.onAppRoute 非首页获取上一个页面栈 exportconstgetCurrentPageUr

  • TCP的组包、半包、粘包与分包

    一、概念 1)组包。简单的说就是tcp协议把过大的数据包分成了几个小的包传输,接收方要把同一组的数据包重新组合成一个完整的数据包。 2)半包。指接受方没有接受到一个完整的包,只接受了部分,这种情况主要是由于TCP为提高传输效率,将一个包分配的足够大,导致接受方并不能一次接受完。 3)粘包与分包。      粘包,指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。     出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取

  • Kubernetes集群Node间歇性NotReady,查到最后竟然是这个原因

    公众号首发:https://mp.weixin.qq.com/s/aNt1uI1RWf73Y3Dd6gmnLg   问题截图 被这个问题困扰一段时间了,先后进行了各种假设,然后又一一推翻,最后找到的原因让人很意外。 这里简单记录一下问题的排查过程,然后直接抛答案,如果想了解详细的调查过程、调查过程中的所思所想和走过的弯路,点击「阅读原文」。 出现问题的集群规模不大,总共200多个Node,最早是从Kubernetes的事件中发现这个问题的,同事反馈时不时地监听到NodeNotReady事件,但是登陆集群查看时Node的状态都是Ready。 一开始忙其它的事情没太在意,后来这种「幽灵式」的NodeNotReady越来越频繁,并且持续的时间越来越长,不但触发了报警系统,而且Node上的Pod也被漂移了,开始着手调查。 线索非常少,检查kube-controller-manager的日志,只看到一条NodeNotReady的事件日志,在kubelet的日志里也翻不到有价值的信息。调整日志级别后,只从kube-controller-manager的日志里得知一个事实: N

  • C语言模板

    /*Includes------------------------------------------------------------------*/ #include"stdio.h" #include"stdlib.h" //全局变量声明区//函数声明区 /*Privatefunctions---------------------------------------------------------*/ /******************************************************************************* *FunctionName:main *Description:Mainprogram. *Input:None *Output:None *Return:None *******************************************************************************/ intmain(void) {  //局部变量声明 printf("hellowor

  • 协程,线程、进程相关链接

    1.Python黑魔法---异步IO(asyncio)协程 https://www.jianshu.com/p/b5e347b3a17c python中重要的模块--asyncio https://www.cnblogs.com/zhaof/p/8490045.html

  • web常见源码泄露

    前言:git,svn,hg等是代码控制系统,即开发人员在开发时使用可以提高开发效率的一种类似集成环境的系统。 转载大佬博文: 一、漏洞成因在WEB安全体系当中,可能你对SQL注入,XSS跨站一些漏洞已经耳熟于心了,而源码泄露问题对于大部分开发者来说就相对陌生了,而源码泄露导致的问题却并不少见,在过往的泄露案例当中,不仅是小网站有此问题,在一些大的厂商同样出现不少,并因此拿到webshell。比如在一些小型企业,可能公司并没有专门的服务器,而是把网站部署在某一个虚拟主机上面,代码文件比较多的时候FTP上传是比较慢的,于是开发者把代码先打包压缩后再上传,上传成功后再去服务器解压,这有虽然解决了上传速度慢的问题,不过却留下了一些安全隐患。压缩包解压后如果没有删除,当攻击者发现后就可以把代码压缩包下载;因为部署到服务器上的都是源代码,这个时候攻击者就可以通过代码进一步挖掘一些安全漏洞:文件上传,SQL注射等。二、GIT源码泄露1.漏洞成因当在一个空目录执行gitinit时,Git会创建一个.git目录。这个目录包含所有的Git存储和操作的对象。如果想备份或复制一个版本库,只需把这个目录拷贝至另

  • winform 使用webbrowser 打开不了pdf的解决办法

      最近有个项目需要在winform打开网络路径的pdf文件,自然想到了webbrowser,但是让我没想到的是,在我电脑调试一点问题都没有,但是到了其他同事的电脑是各种各样的问题,有的打不开,有的显示网页无法显示,百度了好久,大同小异的解决方法就是安装pdf阅读器,设置为pdf默认打开程序,但是。 但是还是没有解决我的问题。实在没办法的就想不用webbrowser了,找个其他的组件看看可不可以,终于找到了,叫pdfview4net 而且也成功,但是,又是但是。这个东西打开有水印,问经理,一句话肯定不行。又回过头来想办法。终于功夫不负有心人呐还是google解决办法让我找到了。来观摩下 https://stackoverflow.com/questions/16277127/webbrowser-control-not-showing-pdf-anymore 而下面有个大神的回答,就是我要的答案。 编译平台设为X86平台,完美解决问题。

  • 将一个size向上取整到大于size的最小ALIGNMENT 的倍数,通常ALIGNMENT 为4的倍数

    如#defineALIGNMENT4 size=(size+ALIGNMENT-1)&~(ALIGNMENT-1)   如 size=11则新的size为12

  • 软件测试具体的流程及所要用到的工具

    一般测试流程:1.需求分析阶段:只要就是对业务的学习,分析需求点。2.测试计划阶段:测试组长就要根据SOW开始编写《测试计划》,其中包括人员,软件硬件资源,测试点,集成顺序,进度安排和风险识别等内容。3.测试设计阶段:测试方案一般由对需求很熟的高资深的测试工程师设计,测试方案要求根据《SRS》上的每个需求点设计出包括需求点简介,测试思路和详细测试方法三部分的方案。《测试方案》编写完成后也需要进行评审。4.测试方案阶段:主要是对测试用例和规程的设计。测试用例是根据《测试方案》来编写的,通过《测试方案》阶段,测试人员对整个系统需求有了详细的理解。这时开始编写用例才能保证用例的可执行和对需求的覆盖。测试用例需要包括测试项,用例级别,预置条件,操作步骤和预期结果。其中操作步骤和预期结果需要编写详细和明确。测试用例应该覆盖测试方案,而测试方案又覆盖了测试需求点,这样才能保证客户需求不遗漏。同样,测试用例也需要评审。5.测试执行阶段:执行测试用例,及时提交有质量的Bug和测试日报,测试报告等相关文档。流程:需求分析→测试计划→测试设计→测试环境搭建→测试执行→测试记录→缺陷管理→软件评估→RTM.

  • sublime text 3 我的习惯配置

    { "color_scheme":"Packages/BoxyTheme/schemes/BoxySolarizedLight.tmTheme", "font_size":15, "ignored_packages": [ "Vintage" ], "open_files_in_new_window":false, "scroll_past_end":true, "theme":"BoxySolarizedLight.sublime-theme", "word_separators":"./\\()\"'-:,.;<>~!@#%^&*|+=[]{}`~?" } 复制   插件列表   AvalonHelper HTML-CSS-JSPrettify LocalizedMenu less less2css 安装完成后记得看readme emmet alignment boxytheme

相关推荐

推荐阅读