精华内容
下载资源
问答
  • 2019-09-23 18:27:11

    有个 test.txt 文件内容为  hello tom,现在修改成 hello jerry,并保存到test2.txt

    sed 's/tom/jerry/g' test.txt >test2.txt

     

    转载于:https://www.cnblogs.com/xbblogs/p/8436404.html

    更多相关内容
  • 主要介绍了Shell脚本实现批量替换文件内容,本文主要实现批量修改一个备份脚本里的备份路径,其它批量替换也可以修改使用,需要的朋友可以参考下
  • bash(以及通常意义上的shell脚本编程)出现的日子可是不短了,每天都有新手通过bash见识到shell脚本编程和系统自动化的威力。随着微软公司在Windows 10中发布了交互式的bash shell以及Unix子系统,现在已是更适合了解...

    6ad96c0525c75dddcf7dc69879218354.png

    bash(以及通常意义上的shell脚本编程)出现的日子可是不短了,每天都有新手通过bash见识到shell脚本编程和系统自动化的威力。随着微软公司在Windows 10中发布了交互式的bash shell以及Unix子系统,现在已是更适合了解shell脚本所能实现的简洁和高效的时候了。

    从计算机出现的早期开始,shell脚本就一直在帮助系统管理员和程序员完成费时费力的枯燥工作。那么,什么是shell脚本?为什么你要关心它?

    什么是shell脚本

    shell脚本就是包含一组可运行的特定shell命令(在本文中是bash shell)的文本文件,命令的执行顺序与其出现在脚本中的顺序一致。shell以命令行的形式提供了可用的操作系统命令库的接口。

    shell脚本其实就是为使用shell环境中的命令所编写的小型程序,可用于自动化那些通常没人愿意手动完成的任务,例如Web爬取、磁盘用量跟踪、天气数据下载、文件更名,等等。你甚至能够用shell脚本制作一些初级的游戏!脚本中可以加入简单的逻辑,例如在其他语言中出现的if语句。

    OS X、BSD以及Linux操作系统中可用的命令行shell有很多种,包括tcsh、zsh和广受欢迎的bash。本文关注的是Unix环境中的主流:bash。

    每种shell都有自己的特性和功能,但是多数人在Unix中最先熟悉的就是bash。在OS X中,Terminal(终端)应用会打开一个bash shell窗口(如图0-1)。在Linux中,有各种各样的shell控制台程序,其中最常见的是gnome-terminal(GNOME)或konsole(KDE)。这些应用可以修改自身的配置来使用其他类型的shell,不过默认选用的都是bash。实际上,不管你用的是哪种类Unix操作系统,打开Terminal应用,得到的都是bash。

    bbac3166d743eed768ef05cf5791ff31.png

    图0-1 OS X中的Terminal应用,其中显示了bash的版本号

    注意 2016年8月,微软发布了针对Windows 10周年版(Windows 10 Anniversary)的bash,所以如果你用的是Windows,照样可以使用bash shell。bash的美妙之处就在于它的可移植性,所以多数脚本基本上应该没问题。

    使用终端与系统交互可能看起来是件艰巨的任务。但随着时间的推移,打开终端,快速对系统做出更改,会变得比在一个又一个的菜单中移动鼠标,找到要更改的选项更加自然。

    执行命令

    bash的核心功能是执行系统命令。来看一个简单的“Hello World”的例子。在bash shell中,echo命令可以在屏幕上显示文本,例如:

    $

    在命令行中输入上面的内容,你就会看到Hello World出现在屏幕上。这行代码执行了bash标准命令echo。bash用来搜索标准命令的目录被保存在环境变量PATH中。你可以使用echo查看PATH变量的内容,如代码清单0-1所示。

    代码清单0-1 输出当前环境变量PATH

    $ echo $PATH
    /Users/bperry/.rvm/gems/ruby-2.1.5/bin:/Users/bperry/.rvm/gems/ruby-2.1.5@
    global/bin:/Users/bperry/.rvm/rubies/ruby-2.1.5/bin:/usr/local/bin:/usr/bin:/
    bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/MacGPG2/bin:/Users/bperry/.rvm/bin
    注意 如果代码清单中既显示了输入命令,也显示了输出内容,输入命令会以粗体显示并以$作为起始,以此同输出内容区分开来。

    输出中的各个目录之间以冒号分隔。当需要运行程序或命令时,bash会检查所有这些目录。如果命令没有在其中,bash就无法执行。另外要注意的是,bash是以这些目录在PATH中出现的顺序依次检查的。顺序在这里很重要,如果有两个同名的命令分别位于PATH中两个不同的目录中,可能会由于目录出现的先后顺序产生不同的结果。如果在查找特定命令时碰到了麻烦,可以用which命令查看待查找命令在PATH中的位置,如代码清单0-2所示。

    代码清单0-2 使用which在PATH中查找命令

    $

    知道了这些信息,你可以把需要测试的文件移动或复制到echo $PATH所列出的某个目录中(如代码清单0-1所示),然后就能执行命令了。本文中使用了which来确定命令的完整路径。在调试有问题的PATH环境变量时,which是一个有用的工具。

    配置登录脚本

    我们会编写一些随后用于其他脚本中的脚本,因此能够轻松调用新脚本就显得很重要了。你可以配置PATH环境变量,使得在启动新的命令shell时,可以像其他命令那样自动调用定制脚本。新命令shell启动后的第一件事是读取用户主目录(在OS X和Linux中分别是/Users/和/home/)中的登录脚本并执行其中的定制命令。根据你所用的系统,登录脚本可以是.login、.profile、.bashrc或.bash_profile。要想知道具体是哪个,像下面这样在这些文件中各加入一行:

    this 

    将最后一个单词调整为对应的文件名,然后登录。这行内容应该会出现在终端窗口顶端,指明登录时运行的是哪个脚本。如果你打开终端,看到的是this is .profile,那么说明你的shell环境载入的是.profile文件;如果看到的是this is .bashrc,则说明是.bashrc文件,以此类推。依赖于你所用的shell,这种行为也会有变化。

    你可以修改登录脚本,让它帮助在PATH变量中加入其他目录。另外也可以在登录脚本中完成其他bash设置,例如修改bash提示符外观、定制PATH等。让我们用cat命令来看一个定制好的.bashrc登录脚本。cat命令接受文件名作为参数,然后将文件内容输出到控制台屏幕,如代码清单0-3所示。

    代码清单0-3 定制过的.bashrc文件,其中将RVM加入了PATH

    $ cat ~/.bashrc
    export PATH="$PATH:$HOME/.rvm/bin" # 将RVM添加到PATH中。

    该代码显示出了.bashrc文件的内容,可以看到PATH获得了一个新的值,允许本地RVM (Ruby version manager,Ruby版本管理器)管理已安装的各种Ruby版本。因为.bashrc在每次启动新的命令shell时都会设置PATH,所以RVM在系统中总是默认可用。

    你可以用类似的方法让自己的shell脚本也默认可用。首先,在主目录中创建一个开发目录,将编写的所有脚本都保存到这个目录。然后在登录脚本中将该目录添加到PATH变量中,这样就可以更方便地引用新写的脚本了。

    命令echo $HOME可以在终端中打印出主目录的路径。进入主目录,然后创建开发目录(建议将其命名为scripts)。接着用文本编辑器打开登录脚本,在脚本顶端添加以下代码(把/path/to/scripts/替换成开发目录的具体路径),将开发目录加入PATH。

    export PATH=

    在此之后,你保存到开发目录中的任何脚本都可以像其他shell命令那样调用了。

    运行shell脚本

    我们到目前为止已经用到了几个命令,例如echo、which和cat,但是只是单独使用,并没有把它们放到shell脚本中。让我们来写一个可以连续执行这些命令的shell脚本,如代码清单0-4所示。这个脚本先打印出Hello World,然后输出shell脚本neqn的路径,neqn应该位于PATH默认的目录中。接着用该路径将neqn的内容打印到屏幕上。(neqn的内容是什么目前并不重要,这里只是作为一个例子而已。)这是利用shell脚本按顺序执行命令序列的一个很好的例子,在这里我们查看了文件的完整系统路径并快速检查了文件内容。

    代码清单0-4 我们的第一个shell脚本

    echo 

    打开你自己惯用的文本编辑器(Linux上的Vim或gedit、OS X上的TextEdit都是很流行的编辑器),输入代码清单0-4中的代码。然后将shell脚本保存到开发目录中并命名为intro。shell脚本对文件扩展名没有特别要求,用不用都行(如果喜欢的话,可以用.sh作为扩展名,但不是必须的)。第一行代码使用echo命令打印出文本Hello World。第二行代码稍微复杂点,使用which命令找出neqn的位置,然后将其用echo命令在屏幕上打印出来。为了像这样将一个命令作为另外一个命令的参数来运行两个命令,bash使用子shell(subshell)来执行第二个命令并将其输出作为第一个命令的参数。在上面的例子中,子shell执行的是which命令,该命令返回neqn脚本的完整路径。这个路径再被用作echo的参数,结果就是在屏幕上显示出neqn的路径。最后,还是用子shell将neqn的路径传给cat命令,在屏幕上打印出neqn脚本的内容。

    保存好文件之后,就可以在终端运行脚本了。代码清单0-5显示了执行结果。

    代码清单0-5 运行我们的第一个shell脚本

    $ sh intro
    ❶ Hello World
    ❷ /usr/bin/neqn
    ❸ #!/bin/sh
     # Provision of this shell script should not be taken to imply that use of
     # GNU eqn with groff -Tascii|-Tlatin1|-Tutf8|-Tcp1047 is supported.
     GROFF_RUNTIME="${GROFF_BIN_PATH=/usr/bin}:"
     PATH="$GROFF_RUNTIME$PATH"
     export PATH
     exec eqn -Tascii ${1+"$@"}
     # eof
     $

    运行这个脚本的时候,使用sh命令并将intro脚本作为参数。sh命令会依次执行脚本中的每行代码,就好像这些命令是在终端上敲入的一样。你可以看到先是打印出了Hello World❶,然后是neqn的路径❷,最后输出neqn的文件内容❸,也就是shell脚本neqn的源代码(至少在OS X上是这样的,Linux版本也许略有不同)。

    让shell脚本用起来更自然

    不使用sh命令也可以执行脚本。如果在shell脚本intro中多加一行,然后修改脚本的权限,就可以像其他bash命令那样直接调用脚本了。在文本编辑器中更新intro脚本:

    #!/bin/bash

    我们在脚本顶端加上了一行/bin/bash❶。这行叫作shebang。shebang允许你指定用哪个程序来解释脚本。这里选择将文件作为bash脚本。你可能还碰到过其他shebang,例如针对Perl(#!/usr/bin/perl)或Ruby(#!/usr/bin/env ruby)的。

    shebang:这个词其实是两个字符名称sharp-bang 的简写。在Unix 的行话里,用sharp 或hash(有时候是mesh)来称呼字符“#”,用bang 来称呼惊叹号“!”,因而shebang 合起来就代表了这两个字符。详情请参考: en.wikipedia.org/wiki/  Shebang_(Unix)。

    有了这行,还得设置文件权限才能像其他程序那样直接运行shell脚本。在终端中的操作方法如代码清单0-6所示。

    代码清单0-6 将脚本intro的权限修改为可执行

    ❶ $ chmod +x intro
    ❷ $ ./intro
     Hello World
     /usr/bin/neqn
     #!/bin/sh
     # Provision of this shell script should not be taken to imply that use of
     # GNU eqn with groff -Tascii|-Tlatin1|-Tutf8|-Tcp1047 is supported.
     GROFF_RUNTIME="${GROFF_BIN_PATH=/usr/bin}:"
     PATH="$GROFF_RUNTIME$PATH"
     export PATH
     exec eqn -Tascii ${1+"$@"}
     # eof
     $

    我们用到了权限修改命令chmod❶并将+x作为命令参数,该参数可以将随后指定的文件设置为可执行权限。权限设置好之后,不用调用bash就可以直接运行shell脚本❷。这是一种很好的shell脚本编程实践,在你以后精进技艺的过程中就会发现它的作用了。

    这只是一个简单的例子,告诉你如何运行shell脚本,如何使用shell脚本运行其他的shell脚本。在今后编写shell脚本的时候,你也会看到更多的shebang。

    为什么要用shell脚本

    你也许疑惑为什么偏要选择bash shell脚本,而不去用那些漂亮的新语言,比如Ruby或Go。尽管这些语言都试图在多种系统上实现可移植性,但它们通常并没有被默认安装。原因很简单:所有Unix机器上都已经有了一个基本的shell,而且绝大多数用的都是bash shell。

    文章开头也提到过,微软最近在Windows 10中也加入了多数Linux发行版和OS X中采用的bash shell。这意味着你的shell脚本几乎不需要做什么额外的工作,就拥有了比以往更好的可移植性。相较于其他语言,shell脚本能够更准确、更轻松地完成系统维护及其他任务。

    代码清单0-7中展示了一个方便的微型shell脚本(没错,只有一行),完全可移植。该脚本可以统计出OpenOffice文档目录中的文档共有多少页,这对于作者特别有用。

    代码清单0-7 统计OpenOffice文档目录中文档页面数量的bash脚本

    #!/bin/bash

    我们不会深究这个脚本的工作细节,毕竟才刚上路嘛!不过概括地讲,脚本从各个文档中提取出页数信息,使用加号将页数拼接在一起,然后通过管道将算式传给命令行计算器,计算出最终的页面总数。所有这一切全在这一行代码中完成。还有更多像这样的酷炫脚本,做过一些练习之后,这个脚本的含义就一目了然了!

    开始动手吧

    如果你之前没有接触过shell脚本编程,那么现在对此应该有了基本的了解。创建小型脚本完成特定的任务是Unix哲学的核心。搞清楚如何编写脚本并根据个人需要扩展Unix系统,这样才能成长为一名高级用户。本文只是道开胃菜,真正酷炫的shell脚本在这本《shell脚本实战(第2版)》里面↓

    e9c8c58c092f2fd4edc1d03eaa750957.png

    • 101个shell经典实例,拿来即用

    • 一册搞定脚本编程技术

    bash仍旧是类Unix服务器或工作站用户的主要工具,这些用户包括Web开发人员(很多人都是在OS X上做开发,然后部署到Linux服务器)、数据分析师、移动应用程序开发人员以及软件工程师,等等。除此之外,大量的业余爱好者也在自己的开源微型计算机(例如树莓派)上运行着Linux,实现智能家庭的自动化。shell脚本是这类用途的不二之选。

    无论是对于在bash技艺上追求精益求精的老手,还是那些偶尔用一下终端或shell脚本的用户,书中所展现的脚本都大有裨益。后一阵营中的用户可能希望温习一些技巧或是学点bash的高级概念,给自己再充充电。

    本书并非教程!其目标是通过(基本上)简短紧凑的脚本教会你bash脚本编程的实用技术以及常见工具的用法,但不会去逐行解释脚本。本书只讲解每个脚本的核心内容,有经验的shell脚本用户通过阅读代码就能明白其余的部分。你大可放开手脚,把脚本拆解开来,根据自己的需要修改,借此达到融会贯通的目的。书中的脚本旨在解决那些三天两头就会碰上的麻烦事,比如Web管理或是文件同步,不管用的是什么工具,每个技术专家都得应付这类问题。

    本书重点关注编写可移植的自动化脚本(例如构建软件或提供业务流程)时经常面对的那些难题,为此我们的做法是先实现一些常见任务的自动化。但如果想从本书中获得最大收益,就要将已形成的解决方案推广应用到其他类似的问题上。

    尽管很多系统管理员都能受益于这个脚本,但其中真正的价值在于,创建包装器脚本这种一般性的解决方案能够确保跨平台行为的一致性。书中随后的章节将深入研究bash脚本编程中一些酷炫的特性以及Unix系统常见的实用工具,为你传授各种绝招。

    目录

    第 1 章 遗失的代码库

    第 2 章 改进用户命令

    第 3 章 创建实用工具

    第 4 章 Unix调校

    第 5 章 系统管理:用户管理

    第 6 章 系统管理:系统维护

    第 7 章 Web与Internet用户

    第 8 章 网站管理员绝招

    第 9 章 Web与Internet管理

    第 10 章 Internet服务器管理

    第 11 章 OS X脚本

    第 12 章 shell脚本趣用与游戏

    第 13 章 与云共舞

    第 14 章 ImageMagick及图像处理

    第 15 章 天数与日期

    附录 A 在Windows 10中安装bash

    附录 B 免费福利

     文末畅聊  

     

    一本好工具书,一定会让你事半功倍!

    工具好书太多,你最先想到了哪本呢?

    《番茄工作法图解》

    《单核工作法图解》

    还是

    《GitHub入门与实践》

    《用数据讲故事》?

    工具书中还有哪些

    你用得特别顺手的呢?

    ......

    写出来跟大家分享一下吧!

    精选留言中随机挑选3位小伙伴,

    赠送

    《shell脚本实战(第2版)》纸质书一本。

    活动截止到5月5日14:00。

    ↓ 查看更多Linux相关图书

    展开全文
  • 最近在学习shell编程,对于shell脚本中第一行用于指定脚本解释器的代码到底有没有起到指定解释器的作用感到疑惑,如:#!/bin/bash在网上查找了不少资料,发现网上竟然也分了两大派,一些人认为#!/bin/bash没有起到...

    最近在学习shell编程,对于shell脚本中第一行用于指定脚本解释器的代码到底有没有起到指定解释器的作用感到疑惑,如:#!/bin/bash

    在网上查找了不少资料,发现网上竟然也分了两大派,一些人认为#!/bin/bash没有起到作用,因为在shell脚本中#表示是注释的意思,而另一些人则认为是起作用的,但是没有给出令人信服的理由,没办法,我只好自己动手做测试了。

    1.首先我先创建了一个名为test.sh的shell文件,里面内容如下

    cac512db873be10ae8c9faf69adb9ab5.png

    这个脚本文件中的第二行代码使用了bash语法,不支持POSIX规范,所以如果这个文件是以bash解释器运行的话,是可以正常运行,而如果换为sh解释器的话,便会报语法错误

    修改test.sh权限

    e29420a361443837ea9f6fff97f5cf80.png

    然后直接执行test.sh

    765562f332ed374413364ec2cb5f6558.png

    可以看到,脚本成功运行,没有报错,然后我将第一行修改为#!/bin/sh

    c156b0ed5bcab07e94f8d81cf230e606.png

    2.然后运行

    78ed0a33f4fcc10ba41fbfc97520addf.png

    这个时候便报了一个语法错误

    由此可以得出结论,shell脚本的第一行指定脚本解释器是确实起作用的,不过值得注意的是,当我们使用指定解释器运行脚本的时候,我们脚本文件中的第一行会失效,比如通过bash+文件名运行脚本的方式,这样即便我在文件中指定是sh解释器,结果依然会以bash解释器运行的。

    (本文由源码时代技术老师原创撰写,转载请注明出处)

    展开全文
  • 今天继续给大家分享Linux笔记,学习是不断地积累以及变成...shell脚本是纯文本文件,以行为单位逐行执行。相当于一种命令翻译器。二. shell脚本的编写2.1脚本的创建使用文本编辑器(或touch)创建脚本文件语法:touch ...

    今天继续给大家分享Linux笔记,学习是不断地积累以及变成自己的东西,光看笔记也没用哦,记得要多实践!

    e2f71002d695aadafc7422da7bc050aa.png

    第8章 shell脚本编程

    一. shell简介

    当命令不在命令行中执行,而是从一个文件中执行时,该文件就称为 Shell 脚本。shell脚本是纯文本文件,以行为单位逐行执行。

    相当于一种命令翻译器。

    二. shell脚本的编写

    2.1脚本的创建

    使用文本编辑器(或touch)创建脚本文件

    语法:touch a.sh

    2.2脚本的执行

    将脚本添加可执行权限

    语法:chmod +x a.sh

    执行脚本命令:

    (1)./a.sh

    (2)sh a.sh

    (3)source a.sh //不需要x权限

    2.3脚本的编写

    编辑脚本:vim a.sh

    #!/bin/bash //系统以bash解释器执行脚本

    cd /etc/

    pwd //命令语句

    三. shell功能

    3.1重定向

    重定向输出:将命令的执行结果覆盖到目标文件

    语法:df > a.txt //将磁盘信息覆盖到a.txt文件

    重定向追加:uname -p >> a.txt //将处理器类型追加到a.txt

    重定向输入:

    vim pass.txt

    123456

    passwd --stdin jerry < pass.txt //标准输入

    tail -2 /etc/shadow //查看用户密码信息后两行

    3.2管道符号

    将左侧的命令输出结果,作为右侧命令的处理对象

    cat a.txt |grep “123” //筛选出含字符串“123”的行

    grep "bash$" /etc/passwd | awk -F: '{ print $1,$7 }' //-F:后要求有空格

    例:提取根分区/的磁盘使用情况

    df -hT //查看磁盘使用情况-h显示更易读-T显示文件系统类型

    df -hT | grep "/$" | awk '{print $6}'

    四. shell变量

    shell变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。

    4.1自定义变量

    4.1.1定义一个新的变量(输入)

    格式:变量名=变量值

    4.1.2查看变量的值(输出)

    格式:echo $变量名

    echo命令的选项:

    -n:取消自动换行

    -e:使用转义字符,把字符串中某些字符当成特殊字符处理

    :制表符

    :换行符

    b:删除前一个字符

    f:换行但光标仍旧停留在原来的位置

    :光标移至行首,但不换行

    赋值时使用引号

    双引号:允许通过$符号引用其他变量值

    单引号:禁止引用其他变量值,$视为普通字符

    反撇号:命令替换,提取命令执行后的输出结果

    4.1.3从键盘输入内容为变量赋值(提示输入)

    格式: read [-p "提示信息"] 变量名

    4.2整数变量运算

    Shell变量的数值运算多用于脚本程序的过程控制,只能进行整数运算,不支持小数 运算。整数的运算主要通过内部命令Expr进行。

    格式:expr 变量1 运算符 变量2 [运算符 变量3]... //注意空格

    常用运算符:加(+)、减(-)、乘(*)、除(/)、取模(%)

    例:设置X(值为35)、Y(值为16)两个变量,并进行加、减、乘、除、取模运算

    X=35

    Y=16

    expr $X + $Y

    expr $X - $Y

    expr $X * $Y //乘法符号在shell中有其它含义,运算时需要转意符号

    expr $X / $Y

    expr $X % $Y

    4.3环境变量

    由系统提前创建,用来设置用户的工作环境

    配置文件:/etc/profile 、~/.bash_profile

    env :查看当前工作环境下的环境变量。

    这表示为 $n,n为1~9之间的数字

    例:编写一个加法运算的小脚本a.sh,用来计算两个整数的和。需要计算的两个整数在执行脚本时以位置变量的形式提供。

    #vim a.sh

    #!/bin/bash

    SUM=`expr $1 + $2`

    echo "$1 + $2 = $SUM"

    #chmod +x a.sh

    #./a.sh 12 24 //$1为12、$2为24

    4.4预定义变量

    是由Bash程序预先定义好的一类特殊变量,使用"$"符号和另一个符号组合表示。

    $# :命令行中位置变量的个数

    $* :所有位置变量的内容

    $? :表示上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错

    $0 :当前执行的进程/程序名

    例:编写一个备份小脚本

    #vim mybak.sh

    #!/bin/bash

    TARFILE=beifen-`date +%s`.tgz

    tar zcf $TARFILE $* &> /dev/null

    echo "已执行$0脚本,"

    echo "共完成$#个对象的备份"

    echo "具体内容包括:$*"

    #chmod +x mybak.sh

    #./mybak.sh /boot/grub

    #./mybak.sh /etc/passwd /etc/shadow

    五. 测试脚本命令

    5.1条件测试

    测试特定的表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值

    格式1:test 条件表达式

    格式2:[ 条件表达式 ] //注意空格,中括号与表达式之间有空格

    执行条件测试操作以后,通过预定义变量"$?"获取返回状态值。

    5.2文件测试

    根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、 可写、可执行等。

    用法:[ 操作符 文件或目录 ]

    -d:测试是否为目录(Directory)

    -e:测试目录或文件是否存在(Exist)

    -f:测试是否为文件(File)

    -r:测试当前用户是否有权读取(Read)

    -w:测试当前用户是否有权写入(Write)

    -x:测试是否设置有可执行权限(Excute)

    例:

    [ -d /media/cdrom ]

    echo $?

    0 //返回0表示条件成立,返回1表示条件不成立

    使用逻辑与"&&"和echo命令一起更直观的显示结果

    [ -d /media/cdrom ] $$ echo "yes"

    yes

    5.3整数值比较

    根据给定的两个整数值,判断第一个与第二个数的关系

    用法:[ 整数1 操作符 整数2]

    -eq:等于(Equal)

    -ne:不等于(Not Equal)

    -gt:大于(Greater Than)

    -lt:小于(Lesser Than)

    -le:小于或等于(Lesser or Equal)

    -ge:大于或等于(Greater or Equal)

    例:判断当前已登录的用户数,超出五个时输出"Too many"

    Unum=`who | wc -l` //查看当前已登录用户数

    [ $Unum -gt 5 ] && echo "Too many."

    5.4字符串比较

    通常用来检查用户输入、系统环境等是否满足条件

    用法1:[ 字符串1 = 字符串2] [ 字符串1 != 字符串2 ]

    用法2:[ -z 字符串 ] //检查是否为空

    通用 :[ 字符串1 操作符 字符串2 ]

    例1:判断当前系统语言,不是"http://en.US"时输出"Not http://en.US "

    echo $LANG

    [ $LANG != "http://en.US" ] && echo "Not http://en.US"

    例2:用户需输入yes或no来确认操作

    read -p "是否覆盖现有文件(yes/no)?" ACK

    [ $ACK = "yes" ] && echo "覆盖"

    read -p "是否覆盖现有文件(yes/no)?" ACK

    [ $ACK = "no" ] $$ echo "不覆盖"

    5.5逻辑测试

    判断两个或多个条件之间的关系

    用法1:[ 表达式1 ] 操作符 [ 表达式2 ]

    用法2:命令1 操作符 命令2

    && :逻辑与,“而且”,使用test命令时可改为"-a"

    || :逻辑或,“或者”,使用test命令时可改为"-o"

    ! :逻辑否,“不”

    例:测试当前系统内核版本是否符合要求

    uname -r

    Mnum=$(uname -r | awk -F. '{print $1}')

    Snum=$(uname -r | awk -F. '{print $2}')

    [ $Mnum -eq 2 ] && [ $Snum -gt 4 ] && echo "符合要求"

    六. if条件语句

    根据复杂程度:单分支的if语句,双分支的if语句,多分支的if语句

    6.1单分支if语句

    只有条件成立时才会执行一条相应的代码

    用法:

    if 条件测试

    then 命令序列

    fi

    例:判断挂载点目录是否存在,若不存在则新建此目录

    vim chkmountdir.sh

    #!/bin/bash

    MOUNT_DIR="/media/cdrom/"

    if [ ! -d $MOUNT_DIR ]

    then

    mkdir -p $MOUNT_DIR

    fi

    chmod +x chkmountdir.sh //给chkmountdir.sh执行的权限

    ./chkmountdir.sh

    6.2双分支if语句

    用法:

    if 条件测试操作

    then 命令序列1

    else 命令序列2

    fi

    例:检查目标主机是否能连通,显示相应信息

    vim pinghost.sh

    #!/bin/bash

    ping -c 3 -i 0.2 -w 3 $1 &> /dev/null //命令执行时的消息都不看

    if [ $? -eq 0] //判断前一条命令的返回状态

    then

    echo "Host $1 is up."

    else

    echo "Host $1 is down."

    fi

    chmod +x pinghost.sh

    ./pinghost.sh 192.168.4.11

    6.3多分支if语句

    用法:

    if 条件测试操作1

    then 命令序列1

    elif 条件测试操作2

    then 命令序列2

    else

    命令序列3

    fi

    例:判断分数范围,分出优秀、合格、不合格三档

    vim gradediv.sh

    #!/bin/bash

    read -p "请输入您的分数(0-100):" GRADE

    if [ $GRADE -ge 85 ] && [ &GRADE -le 100 ]

    then

    echo "$GRADE 分!优秀"

    elif [ $GRADE -ge 70 ] && [ &GRADE -le 84 ]

    then

    echo "$GRADE 分,合格"

    else

    echo "$GRADE分?不合格"

    fi

    chmod +x gradediv.sh

    ./gradediv.sh

    七. for循环语句

    读取不同的变量,用来逐个执行同一组命令

    用法:

    for 变量名 in 取值列表

    do

    命令序列

    done

    例1:根据姓名列表批量添加用户

    vim /root/users.txt //用作测试列表文件

    jdy

    ttl

    tcc

    vim uaddfor.sh

    #!/bin/bash

    ULIST=$(cat /root/users.txt)

    for UNAME in $ULIST //从列表文件读取用户名

    do

    useradd $UNAME

    echo "123456" | passwd --stdin $UNAME &> /dev/null

    //通过管道指定密码字串

    done

    chmod +x uaddfor.sh

    ./uaddfor.sh

    tail -3 /etc/passwd

    例2:根据IP地址列表检查主机状态

    vim /root/ipadds.txt

    192.168.4.11

    192.168.4.100

    192.168.4.120

    vim chkhosts.sh

    #!/bin/bash

    HLIST=$(cat /root/ipadds.txt)

    for IP in $HLIST

    do

    ping -c 3 -i 0.2 -W 3 $IP &> /dev/null

    if [ $? -eq 0 ] //嵌套if语句判断连通性

    then

    echo "Host $IP is up."

    else

    echo "Host $IP is down."

    fi

    done

    chmod +x chkhosts.sh

    ./chkhosts.sh

    for循环语句非常适合用于列表对象无规律,且列表来源已经固定。而对于要求控制循环次数,操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合while循环语句。

    八. while循环语句

    重复测试某个条件,只要条件成立则反复执行

    用法:

    while 条件测试操作

    do

    命令序列

    done

    例:批量添加规律编号的用户

    #vim uaddwhile.sh

    #!/bin/bash

    PREFIX="stu"

    i=1

    while [ $i -le 20 ]

    do

    useradd ${[PREFIX}$i

    echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null

    let i++ //序号递增,避免死循环

    done

    chmod +x uaddwhile.sh

    ./uaddwhile.sh

    grep "stu" /etc/passwd | tail -3

    例:猜价格游戏,要求由脚本预先生成一个随机的价格数目(0-99)作为实际价格,判断用户猜测的价格是否高出或低于实际价格,给出相应的提示后再次要求用户猜测,直到用户猜中实际价格为止,输出用户共猜测的次数、实际价格。

    #vim pricegame.sh

    #!/bin/bash

    PRICE=$(expr $RANDOM % 1000) //输入price一个随机数

    TIMES=0

    echo "商品实际价格范围为0-999,猜猜看是多少?"

    while true //循环条件:true

    do

    read -p "请输入你猜测的价格数目:" INT

    let TIMES++

    if [ $INT -eq $PRICE ] ; then

    echo "恭喜你答对了,实际价格是$PRICE"

    echo "你总共猜测了$TIMES次"

    exit 0

    elif [ $INT -gt $PRICE ] ; then

    echo "太高了!"

    else

    echo "太低了!"

    fi

    done

    chmod +x pricegame.sh

    ./pricegame.sh

    九. case分支语句

    针对变量的不同取值,分别执行不同的命令序列

    用法:

    case 变量值 in

    模式1)

    命令序列1

    ;;

    模式2)

    命令序列2

    ;;

    ......

    *)

    默认命令序列

    esac

    例:检查用户输入的字符类型

    提示用户从键盘输入一个字符,通过case语句判断该字符是否为字母、数字或者其他控制字符,并给出相应的提示信息。

    #vim hitkey.sh

    #!/bin/bash

    read -p "请输入一个字符,并按Enter键确认:" KEY

    case "$KEY" in

    [a-z] || [A-Z])

    echo "你输入的是 字母."

    ;;

    [0-9])

    echo "你输入的是 数字."

    ;;

    *)

    echo "你输入的是 空格、功能键或其他控制字符."

    esac

    chmod -x hitkey.sh

    ./hitkey.sh

    十. sed、awk语句

    10.1 Sed简介

    sed是stream editor(流编辑器)的缩写,是一种在线编辑器,它一次处理一行内容。sed是非交互式的编辑器。

    处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

    10.2 Sed命令用法

    格式:sed+[选项]+‘命令’+文件名

    常用选项:

    -n :取消默认输入

    -e :多项编辑

    -i :直接修改读取的档案内容,而不是由屏幕输出

    常用命令:

    a :当前行后添加行

    i :当前行前添加行

    c :用字符串替换行

    d :删除行

    p :打印行

    s :用一个字符串替换另一个

    w :将所选的行写入文件

    10.3 Sed定址

    用于‘命令’之前,决定对哪些行进行编辑。

    如果没有指定地址,sed将处理输入文件的所有行。

    1.地址是一个数字,则表示行号;是“$"符号,则表示最后一行。

    2.地址可以指定范围,当需指定范围时使用逗号(,)隔开。

    10.4 Sed用法

    1.p命令

    格式:sed -n ‘行号p’ 文件名

    2.d命令

    格式:sed -n ‘行号d’ 文件名

    3.s命令

    格式:sed -n ‘行号s/a/b/g’文件名

    将文件中指定行里所有的a字符替换为b字符,g为全局变量

    4.i命令

    格式:sed -i ‘行号3d’文件名

    直接修改文件内容,不打印在屏幕上

    5.e命令

    格式:sed -e ‘3d’ -e ‘4p’ 文件名

    先删除第三行,再打印第四行字符

    10.5 awk简介

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。

    简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

    10.6 awk用法

    1.格式:awk ' pattern {action} '

    pattern常指关系表达式,例如:

    awk‘/a/’file——显示文件中包含a的行

    awk‘$2>10’file——显示第二列中数字大于10的行

    2. 分隔提取:awk –F“分隔符”‘{print $1}’

    例如:

    awk –F.‘{print $1, print $2}’表示以点为分隔符将每一行的前二个字段,分行输出

    10.7 awk实例

    判定输入ip的有效性:

    vim a.sh

    #!/bin/bash

    read -p “请输入ip:” A

    B=`echo $A |awk -F. “{print $1}”`

    if [ $B -le 0 ] || [ $B -gt 255 ]

    then echo “请输入正确的IP”

    else

    echo “ok”

    fi

    chmod +x a.sh

    sh a.sh

    十一. shell实例

    例1:编写一个系统服务脚本

    vim myprog

    #!/bin/bash

    case "$1" in

    start)

    echo -n "正在启动sleep服务..."

    if sleep 7200 &

    then

    echo "OK"

    fi

    ;;

    stop)

    echo -n "正在停止sleep服务..."

    pkill "sleep" &> /dev/sull

    echo "OK"

    ;;

    status)

    if pgerp "sleep" &> /dev/sull ;

    then

    echo "sleep服务已经启动."

    else

    echo "sleep服务已经停止."

    fi

    ;;

    restart)

    $0 stop

    $0 start

    ;;

    esac

    chmod +x myprog

    ./myprog start

    例2: shell打印九九乘法表

    使用for循环

    for i in $(seq 1 9)

    do

    for j in $(seq 1 $i)

    do

    echo -n “$j * $i” = $[i * j] “ ”

    done

    echo

    done

    //例中$[i * j]可写为:$((i * j))、$[$j*$i]、$(( $j * $i ))、`expr $i * $j`

    //修改:第二个do下加一行 let “temp = i * j”,再把$[i * j]改为:$temp

    while 反向的乘法表:

    i=9

    j=1

    while ((i>=1))

    do

    while ((j<=i))

    do

    echo -n “$j * $i”=$[$j * $i] “ ”

    let j++

    done

    len j=1

    let i--

    echo “”

    done

    ----------------------------------------------end------------------------------------------------

    今天的笔记就分享到这里,如果你觉得自己的学习方法有问题,或者还有啥想知道的,都可以告诉我哟~

    a7bfd1f270c044e5d05b6e30e0ac21e1.png
    展开全文
  • shell 修改文件内容

    2021-10-15 12:01:58
    sed -i '/\/sbin\/nologin/s/login/LOGIN/g' passwd sed -i 's/错误消息过多,请登录Kibana查看https:\/\/eslog.thingsmatrix.io/错误消息过多/g' tmx*
  • 当我们在进行自动化shell脚本编辑的时候,有时候需要进行编辑或者修改相应的配置文件。 那么sed是一个很不错的选择 二、sed介绍 sed是Linux下一款功能强大的非交互流式文本编辑器。 对文本文件进行增、删、改、查等...
  • Linux用shell修改文件内容

    千次阅读 2021-05-10 21:06:02
    sed -i 's/abc/xxx/g' fileabc修改前的字符串xxx是修改后的字符串file是要被修改文件例如:我有一个文件是map_server#!/bin/bash# chkconfig: 2345 10 90# description: Starts and Stops the MapServer.DIRECTORY=...
  • 主要介绍了Shell脚本实现根据文件修改时间来分类文件,本文直接给出实现代码,需要的朋友可以参考下
  • shell脚本修改文件内容

    万次阅读 2018-10-18 18:09:30
    #!/bin/bash echo "------ make_data_start -----" YIN="'" HOST="10.91.4.13"...s/es_host_list=*/es_host_list=$HOST/g"...s/\(es_host_list=\)\S*/\1${YIN}${HOST}$... /mnt/shell_...
  • linux下perl,sed,shell批量替换文件内容.docx
  • shell脚本修改文件内容

    万次阅读 2016-05-13 13:37:26
    1、修改文件中的内容:将oldstring修改为newstring  sed -i "s/oldstring/newstring/g" test.txt  如果将oldstringXXX修改为newstring:  sed -i "s/oldstring*/newstring/g" test.txt 2、将某个目录中...
  • shell脚本编写(3.修改文件内容

    千次阅读 2019-09-17 10:18:11
    test.txt可以清空文件中的内容。 向文件中写东西(追加),要重写的话可以和上面命令配合。 cat >> test.txt << EOF 要写入的东西 EOF PS:一定要以EOF结尾。 2. 输出,等于多个echo。 ...
  • 主要介绍了shell替换文件中的文件路径脚本,需要的朋友可以参考下
  • linux通过shell脚本修改文件内容

    千次阅读 2015-08-20 18:02:00
    sed -i 's/abc/xxx/g' fileabc修改前的字符串xxx是修改后的字符串file是要被修改文件 转载于:https://www.cnblogs.com/shijiaoyun/p/4745974.html
  • linux shell 修改文件内容

    千次阅读 2020-04-30 21:20:38
    文件:daemon.json { "registry-mirrors": [ "http://mirror.local" ], "insecure-registries": [ "xxx" ], "mtu": 1360, "bip": "192.168.1.1/24" } 需求 把i...
  • 原文:https://editor.csdn.net/md/?articleId=120167145
  • 主要介绍了Shell脚本文件从GBK转为UTF-8编码,需要的朋友可以参考下
  • 在将windows上的jsp网页移植到linux环境中时,发现一个个的转换编码及修改默认编码类型太慢,写此脚本进行尝试文件遍历~ 好久不写,手生了。 代码如下: #!/bin/bash # # SPATH=”/root/chengji/WebRoot” DPATH=”/...
  • shell脚本修改配置文件中的内容

    万次阅读 2018-01-24 11:33:36
    测试“利用 shell脚本修改配置文件中的内容” sed -i -e 's|BOOTPROTO=none|BOOTPROTO=dhcp|' conf.txt测试文件test_sed.txt中的内容为: 图 4 测试文件test_sed.txt 图 5 实验成功
  • 主要介绍了Shell脚本批量重命名文件后缀的3种实现,本文分别使用find + xargs +sed、for循环、rename等3种方法实现重命名文件后缀,需要的朋友可以参考下
  • 脚本生成二进制白文件脚本内配置生成单文件大小,生成文件夹中文件大小,文件夹名生成规则为递增。运行后手动输入生成地址与生成所需的文件大小。后期方便管理,可以通过删除单个文件,或者单个文件夹,做到细化...
  • 主要介绍了Shell脚本批量修改文件后缀名,问中收集了2个示例,需要的朋友可以参考下
  • #!/bin/bash funmd5_1() { find /root/passwd -type f | xargs md5sum > /tmp/funmd5_1.log } funmd5_2() { find /root/passwd -type f | xargs md5sum > /tmp/funmd5_2.log } if [ ! -f /tmp/funmd5_1.log ];...
  • 测试代码: #include <fstream> #include <...修改buffer的值,将10改成5。 方法一: sed -i "/#define/{s/10/5/g}" test.cu(文件名) sed -i '/#define/{s/10/5/g}' test.cu(文件名)
  • shell脚本修改指定文件中的指定内容

    千次阅读 2020-04-07 15:54:45
    sed -i 's/修改前的内容/想要修改成的内容/g' FileName
  • 我们的项目中有一个SkyCameraInfo.xml,在每次启动程序后需要手动修改这个xml文件里的内容修改方式有两种: 1、使用sed命令 新建shell脚本test.sh,赋予脚本可执行权限,脚本内容如下: #!/bin/sh if [ $#...
  • shell脚本修改json中某个字段的值 - 思路:通过awk来找到旧数据,然后用sed来替换旧数据
  • 现在要根据文件中的内容更改对应文件和目录的权限 #!/bin/bash # vim:et:ts=4:sw=4: #DATE:2021-08-29 #DESCRIBE:修改文件和目录权限,操作日志存放到file_permission.log #MODIFY: [ "$#" -ne 1 ] && ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 504,770
精华内容 201,908
关键字:

shell脚本修改文件内容

友情链接: NineLock.zip