位置: 编程技术 - 正文

Linux 脚本编写基础知识(linux编写一个脚本)

编辑:rootadmin

1. Linux 脚本编写基础1.1 语法基本介绍1.1.1 开头程序必须以下面的行开始(必须放在文件的第一行):#!/bin/sh  符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。  当编辑好脚本时,如果要执行该脚本,还必须使其可执行。  要使脚本可执行:编译 chmod +x filename 这样才能用./filename 来运行1.1.2 注释  在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。1.1.3 变量  在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:#!/bin/sh#对变量赋值:a="hello world"# 现在打印变量a的内容:echo "A is:"echo $a有时候变量名很容易与其他文字混淆,比如:num=2echo "this is the $numnd"这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:num=2echo "this is the ${num}nd"  这将打印: this is the 2nd1.1.4 环境变量由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。1.1.5 Shell命令和流程控制在shell脚本中可以使用三类命令:1)Unix 命令:  虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。常用命令语法及功能  echo "some text": 将文字内容打印在屏幕上  ls: 文件列表  wc ?l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数  cp sourcefile destfile: 文件拷贝  mv oldname newname : 重命名文件或移动文件  rm file: 删除文件  grep 'pattern' file: 在文件内搜索字符串比如:grep 'searchstring' file.txt  cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令  cat file.txt: 输出文件内容到标准输出设备(屏幕)上  file somefile: 得到文件类型  read var: 提示用户输入,并将输入赋值给变量  sort file.txt: 对file.txt文件中的行进行排序  uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq  expr: 进行数学运算Example: add 2 and 3expr 2 "+" 3  find: 搜索文件比如:根据文件名搜索find . -name filename -print  tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile  basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux  dirname file: 返回文件所在路径比如:dirname /bin/tux将返回 /bin  head file: 打印文本文件开头几行  tail file : 打印文本文件末尾几行  sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus 替换为LinuxFocus :cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.file  awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F, '{print $1 "," $3 }'这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, , IndiaKerry Miller, , USA命令输出结果为:Adam Bor, IndiaKerry Miller, USA2) 概念: 管道, 重定向和 backtick  这些不是系统命令,但是他们真的很重要。  管道 (|) 将一个命令的输出作为另外一个命令的输入。grep "hello" file.txt | wc -l  在file.txt中搜索包含有”hello”的行并计算其行数。  在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。  重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。  > 写入文件并覆盖旧文件  >> 加到文件的尾部,保留旧文件内容。反短斜线 使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。命令:find . -mtime -1 -type f -print  用来查找过去小时(-mtime ?2则表示过去小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下脚本:#!/bin/sh# The ticks are backticks (`) not normal quotes ('):tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`3) 流程控制1.if  "if" 表达式 如果条件为真则执行then后面的部分:if ....; then  ....elif ....; then  ....else  ....fi大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…  通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。[ -f "somefile" ] :判断是否是一个文件[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限[ -n "$var" ] :判断$var变量是否有值[ "$a" = "$b" ] :判断$a和$b是否相等  执行man test可以查看所有测试表达式可以比较和判断的类型。  直接执行以下脚本:#!/bin/shif [ "$SHELL" = "/bin/bash" ]; then echo "your login shell is the bash (bourne again shell)"else echo "your login shell is not bash but $SHELL"fi  变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。快捷操作符熟悉C语言的朋友可能会很喜欢下面的表达式:[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"  这里 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。同样或操作(||)在shell编程中也是可用的。这里有个例子:#!/bin/shmailfolder=/var/spool/mail/james[ -r "$mailfolder" ]' '{ echo "Can not read $mailfolder" ; exit 1; }echo "$mailfolder has mail from:"grep "^From " $mailfolder该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的"From" 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:  -打印错误信息  -退出程序  我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。  不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。2.casecase :表达式可以用来匹配一个给定的字符串,而不是数字。case ... in...) do something here ;;esac  让我们看一个例子。 file命令可以辨别出一个给定文件的文件类型,比如:file lf.gz  这将返回:lf.gz: gzip compressed data, deflated, original filename,last modified: Mon Aug :: , os: Unix 我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:#!/bin/shftype=`file "$1"`case "$ftype" in"$1: Zip archive"*)  unzip "$1" ;;"$1: gzip compressed"*)  gunzip "$1" ;;"$1: bzip2 compressed"*)  bunzip2 "$1" ;;*) echo "File $1 can not be uncompressed with smartzip";;esac  您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。也就是说,当我们运行:smartzip articles.zip$1 就是字符串 articles.zip3. selsectselect 表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。select var in ... ; do breakdone.... now $var can be used ....下面是一个例子:#!/bin/shecho "What is your favourite OS?"select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do    breakdoneecho "You have selected $var"  下面是该脚本运行的结果:What is your favourite OS?1) Linux2) Gnu Hurd3) Free BSD4) Other#? 1You have selected Linux4.looploop表达式:while ...; do....done  while-loop 将运行直到表达式测试为真。will run while the expression that we test for is true.关键字"break" 用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。  for-loop表达式查看一个字符串列表 (字符串用空格分隔) 然后将其赋给一个变量:for var in ....; do  ....done在下面的例子中,将分别打印ABC到屏幕上:下面是一个更为有用的脚本showrpm,其功能是打印一些RPM包的统计信息:  这里出现了第二个特殊的变量$*,该变量包含了所有输入的命令行参数值。如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.5. 引号在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量值。为了防止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件, mail.jpg 和tux.jpg。1.2 编译SHELL脚本#ch#!/bin/sh mod +x filename cho *.jpg ∪缓螅梢酝ü淙耄?./filename 来执行您的脚本。  这将打印出"mail.jpg tux.jpg"的结果。    引号 (单引号和双引号) 将防止这种通配符扩展:

#!/bin/shecho "*.jpg"echo '*.jpg'

  这将打印"*.jpg" 两次。  单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。

#!/bin/shecho $SHELLecho "$SHELL"echo '$SHELL'

  运行结果为:/bin/bash/bin/bash$SHELL

  最后,还有一种防止这种扩展的方法,那就是使用转义字符——反斜杆:echo *.jpgecho $SHELL  这将输出:*.jpg$SHELL6. Here documents当要将几行文字传递给一个命令时,here documents(译者注:目前还没有见到过对该词适合的翻译)一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果我们四有那个 here documents就不必用echo函数一行行输出。 一个 "Here document" 以 shift by 2  这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数.第2部分 实例现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令:cp framework.sh myscript 然后再插入自己的函数。  让我们再看两个例子:  二进制到十进制的转换  脚本 b2d 将二进制数 (比如 ) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子: 该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,,..),比如二进制""可以这样转换成十进制:0 * 1 + 1 * 2 = 2  为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc ?c计算字符个数,然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。文件循环程序  或许您是想将所有发出的邮件保存到一个文件中的人们中的一员,但是在过了几个月以后,这个文件可能会变得很大以至于使对该文件的访问速度变慢。下面的 脚本rotatefile可以解决这个问题。这个脚本可以重命名邮件保存文件(假设为outmail)为outmail.1,而对于outmail.1就变成了outmail.2 等等等等...  这个脚本是如何工作的呢?在检测用户提供了一个文件名以后,我们进行一个9到1的循环。文件9被命名为,文件8重命名为9等等。循环完成之后,我们将原始文件命名为文件1同时建立一个与原始文件同名的空文件。调试  最简单的调试命令当然是使用echo命令。您可以使用echo在任何怀疑出错的地方打印任何变量值。这也是绝大多数的shell程序员要花费%的时间来调试程序的原因。Shell程序的好处在于不需要重新编译,插入一个echo命令也不需要多少时间。  shell也有一个真实的调试模式。如果在脚本"strangescript" 中有错误,您可以这样来进行调试:sh -x strangescript  这将执行该脚本并显示所有变量的值。  shell还有一个不需要执行脚本只是检查语法的模式。可以这样使用:sh -n your_script  这将返回所有语法错误---------------------------------自动重启脚本假定需要实现重启的程序名为 test ,我们这里通过判断进程数目来判断程序是否正常。ps -ef | grep "$1" | grep -v "grep" | wc ?l 是获取$1(本例中为test)的进程数,脚本根据进程数来决定下一步的操作。通过一个死循环,每隔1秒检查一次系统中的指定程序的进程数。

代码如下:

脚本check 脚本start: 加入limit coredumpsize ,设置core file的大小,一旦程序Core Dump,有迹可寻。在该脚本中后台执行check脚本,可以省去很多麻烦,

#!/bin/cshlimit coredumpsize ./check &------------------------------shell语法shell语法--------------------------------------------------------------------------------?&&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功&&那么执行这个命令”。||则与&&相反。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。为了在当前shell中执行一组命令,可以用命令分隔符隔开每一个命令,并把所有的命令用圆括号()括起来。如果使用{}来代替(),那么相应的命令将在子shell而不是

推荐整理分享Linux 脚本编写基础知识(linux编写一个脚本),希望有所帮助,仅作参考,欢迎阅读内容。

Linux 脚本编写基础知识(linux编写一个脚本)

文章相关热门搜索词:linux脚本编写教程,linux脚本基础,linux写一个简单的脚本,linux写一个简单的脚本,linux写一个简单的脚本,Linux脚本编写基础,linux写一个简单的脚本,linux 脚本编程,内容如对您有帮助,希望把文章链接给更多的朋友!

Linux Shell简介 前言第一篇:超级工具/Terminals,xterms和Shells一、超级工具二、为了说明shell,这里需要一些背景知识。1、Terminals,xterms与Shells2、终端(Terminals)3、xterm

linux shell中的比较符号与特殊符号介绍 shell字符串比较、判断是否为数字二元比较操作符,比较变量或者比较数字。注意数字与字符串的区别。整数比较-eq等于,如:if["$a"-eq"$b"]-ne不等于,如:if["$

自动重启服务的shell脚本代码 #!/bin/bashif[!-f/tmp/down_count];thenecho"0"gt;/tmp/down_countficurl-Itomcat-host-o"/tmp/status"gt;/dev/null2gt;amp;1code=`awk'NR==1{print$2}'/tmp/status`if["$[code]"-ge];thendown=`expr$(cat/tmp/d

标签: linux编写一个脚本

本文链接地址:https://www.jiuchutong.com/biancheng/376829.html 转载请保留说明!

上一篇:浅析linux下如何用脚本自动发送文本mail邮件(linux小技巧)

下一篇:Linux Shell简介(linux shell有什么用)

  • 公司替员工承担个税怎么入账
  • 成本票有哪些种类
  • 一般纳税人购入固定资产的账务处理
  • 公司车辆卖给个人怎么处理账务
  • 为什么租赁只能20年
  • 填仓2021
  • 现金流管理模式
  • 发票存在哪些税务风险?
  • 养老保险补缴利率是多少
  • 土地转让契税税率2020税率表
  • 网银转账手续费标准
  • 估价入账是什么意思
  • 增值税发票委托公司开具
  • 小规模的企业
  • 企业完税凭证入账后怎么办理退税?
  • 在公司发现问题该说吗
  • 劳务费按次500元
  • 企业吸收合并税收政策
  • 高新补贴是什么意思
  • 个税退手续费要多久到账
  • 稿酬计入工资所得吗
  • win7为什么还有人用
  • win11系统咋样
  • 企业向银行贷款要交印花税吗
  • php数据库语句
  • 微信公众平号平台
  • 客户抽奖活动方案
  • 时间序列多步预测方法
  • 最优化模型的优点
  • php与ajax交互
  • 图像识别算法汇总表
  • java默认访问权限修饰符
  • 预提开发成本的会计分录
  • 出租车发票可以重新打印吗
  • 免税农产品发票怎么抵扣申报
  • mysql安装问题
  • 城市维护建设税的计税依据
  • 营业外收入的账户核算有哪些
  • 厂房鉴定费的账户是什么
  • 低值易耗工具有哪些
  • 公司广告制作费用申请报告
  • 利润总额是负数怎么计算利润率
  • 资本公积转为实收资本会计科目
  • 进口关税税款的计税依据
  • 兼职会计如何做账报税
  • 什么公司转让需要交税
  • 投标保证金退回是不是没中标
  • 印花税需要计提税金及附加吗
  • 公司的三证合一是什么
  • Sqlserver 2000/2005/2008 的收缩日志方法和清理日志方法
  • mysql 5.7.22安装教程
  • 重装win7系统后鼠标反应慢
  • efi shell有什么用
  • mac屏幕共享软件
  • linux vmtool
  • win7如何设置电脑输入法
  • linux网络不可用
  • macbook恢复macos
  • linux epub阅读器
  • win10专业版怎么调屏幕亮度
  • win10怎么查看磁盘是固态还是机械
  • BootStrap glyphicons 字体图标实现方法
  • 备份mbr引导
  • 基于nodejs的api框架
  • shell遍历sql查询结果
  • python列表讲解
  • unity strangeioc
  • Unity3D游戏开发标准教程吴亚峰于复兴人民邮电出版社
  • 正确的解决方式
  • unity效率
  • 使用mvc模式设计的web应用程序
  • 使用java
  • 下岗职工再就业优惠政策
  • 郑州二套房契税征收2023标准是多少
  • 小规模纳税人个税税率
  • 山西税务12366
  • 上海如何用电子医保卡
  • 增值税专用发票增额需要什么资料
  • 网上如何申请
  • 地税服务大厅上班时间
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设