shell编程基础(一)

shell
shell脚本编程:
    1)什么叫编程,编程就是编写程序源代码。为了能够让用户在使用计算机的时候,可以让计算机以非交互式的方式完成某   些任务,需要将这些任务编制称为一个文件,让计算机顺序读取,从而实现功能;

2)编程语言:
        高级语言:
            根据源代码的处理方式:
                编译运行语言:
                    源代码 --> 编译器(编译) --> 汇编器(汇编) --> [链接器(库的链接)] -->可以直接执行的二进制文件;
                解释运行语言:
                    源代码 --> 直接启动跟源代码对应的解释器程序,由解释器边解释边执行;

根据其编程过程中的功能的实现是调用库还调用外部程序文件:
                完整编程语言:
                    利用库或编程组件进行编程;

脚本编程语言:
                    解释器
                    shell脚本:调用shell程序,其次调用需要的外部命令文件;命令解释器
                        提供了单一功能的编程接口:过程式编程逻辑的支持;

根据程序的编写范式:程序=指令+数据   程序=算法+数据结构
                过程式编程语言:
                    以指令(算法)为中心,围绕指令(算法)的实现设计数据和数据结构,数据为指令服务的;

算法或指令的实现形式:
                        顺序执行
                        选择执行
                        循环执行

对象式编程语言:
                    以数据为中心,将数据实例化为类,围绕着数据的需求来部署指令
                        类(class):被实例化的数据
                        属性(attribution):同一类中的不同对象的区分依据;
                        方法(method):类的正确的操作方法;

低级语言:
            汇编语言

shell脚本编程是一种过程式编程语言,解释运行,依赖于外部程序文件运行;

3)shell脚本到底是什么?
      1.纯文本文档——文件中所存储的数据都是以字符为单位进行存储的;
      2.根据用户的需求来解决用户问题的大量命令的组合体;
      3."执行幂等性"——任何命令多次执行的结果是一致的;
        很多命令都不具备"执行幂等性",在shell脚本中就需要使用大量的程序逻辑来判断某个命令是否满足其运行条件,以避免在运行过程中出现严重错误;

4) shell脚本中的代码内容:
      1.首行必须是shebang,解释器路径,必须占据绝对行首:在执行时,启动相应的解释器以解释脚本内诸多的命令;
        #!/bin/bash
        #!/bin/sh
        #!/usr/bin/python
        #!/usr/bin/perl
      2.在shell脚本中,除了shebang之外,以#占据绝对行首的内容,均为注释行;解释器会忽略这样的行的内容;
      3.解释会忽略脚本中所以的空白行;
      4.大量的命令和关键字(if,else,then,do,while,for,...)
      5.bash中所有的特殊字符;

注意:shell脚本一旦运行,是在当前的shell中根据shebang的指示,开启一个解释器(子shell)解释执行代码内容,shell脚本的内容是在一个子shell进程中实现的;

我们可以利用文本编辑工具来编写shell脚本:
    nano、vi、vim、emacs、pico

推荐使用vim:语法着色特性,自动缩进,...

脚本命名方式:可以使用.sh的文件名后缀;在低版本的vim编辑器,只能根据.sh的后缀命令来识别是否为shell脚本;高版本的vim编辑器,则无需过多的关心文件后缀名的问题;

5)脚本的运行方法:
    1.为脚本文件赋予执行权限,直接运行此文件;
        ~]# chmod +x /PATH/TO/SCRIPT_FILE
        ~]# /PATH/TO/SCRIPT_FILE

如果在执行脚本时,只写脚本文件名不给出路径的话,必须确保PATH变量中保存的路径下,能找到该脚本文件;

2.直接使用解释器运行脚本,将脚本作为解释器命令的参数;
        bash /PATH/TO/SCRIPT_FILE
        bash -x /PATH/TO/SCRIPT_FILE:将脚本的运行过程展示出来,一般用于脚本排错;
        bash -n /PATH/TO/SCRIPT_FILE:对脚本进行语法排错,如果存在语法错误,则bash会给予提示,针对于这类错误提示,需要我们自行判断错误发生的位置;

6)文本处理工具:
    vim、vi、nano

文本处理三剑客:
    grep系:grep、egrep、fgrep,文本搜索工具,基于"PATTERN"对于给定的文本进行模糊搜索,grep系默认工作于贪婪模式下;

sed:Stream EDitor,流编辑器,行编辑器,文本编辑工具;

awk:gawk——GNU awk,文本格式化工具,文本报告生成器,文本处理的编程语言;

grep系:
     grep
     egrep
     fgrep

grep:Global search Regular Expression and Print out the line.
                利用正则表达式进行全局搜索并将匹配的行显示出来;
    grep [OPTIONS] PATTERN [FILE...]
        PATTERN:过滤条件,是由正则表达式元字符以及没有特殊含义的文本字符组成;
            正则表达式的元字符:
                会被正则表达式引擎解释为特殊含义;
                pcre——perl语言的正则表达式引擎;

基本的正则表达式:BRE
                扩展的正则表达式:ERE

grep默认仅支持基本正则表达式;
    egrep默认仅支持扩展正则表达式;
    fgrep默认不开启正则表达式引擎;

文本字符:
                只具备字符便面含义的那些字符;
        常用选项:
            -i, --ignore-case:忽略文本字符的大小写;
            -v, --invert-match:反向匹配;最终显示的结果是PATTERN不能成功匹配的行;
            -c, --count:计数,统计匹配PATTERN的所有的行数;
            -o, --only-matching:关闭贪婪模式,仅显示PATTERN能够匹配的内容;
            -q, --quiet, --silent:安静模式,不输出任何匹配结果;
            --color[=WHEN], --colour[=WHEN]:将匹配PATTERN的内容以特殊颜色高亮显示;
                --color=auto
            -E, --extended-regexp:扩展的正则表达式,grep -E相当于egrep;
            -F, --fixed-strings, --fixed-regexp:grep -F相当于fgrep
            -G, --basic-regexp:基本的正则表达式,egrep -G相当于grep
            -P, --perl-regexp:使用PCRE(Perl Common Regular Expression)引擎;
            -A NUM, --after-context=NUM:在显示匹配PATTERN的行的同时显示其后面的NUM行;
            -B NUM, --before-context=NUM:在显示匹配PATTERN的行的同时显示其前面的NUM行;
            -C NUM, -NUM, --context=NUM:在显示匹配PATTERN的行的同时显示其前后各NUM行;

PATTERN:
            正则表达式元字符:
                基本的正则表达式元字符:
                    GLOBBING-------简化版的正则表达式: [] ? *

字符匹配:
                        . :匹配任意单个字符;
                        []:匹配指定范围内的任意单个字符;
                        [^]:匹配指定范围以外的任意单个字符;
                        下列所有的字符集都可以放置于[]之中用于匹配单个字符;
                            [:lower:]
                            [:upper:]
                            [:alpha:]
                            [:digit:]
                            [:space:]
                            [:alnum:]
                            [:punct:]
                            [:blank:]
                            [:xdigit:]:所有的十六进制数字;
                            a-z:所有的小写字母
                            A-Z:所有的大写字母
                            0-9:标识所有的十进制数字
       [:alnum:](字母和数字),    [:alpha:](字母),    [:cntrl:](),   [:digit:](数字),
       [:graph:](),   [:lower:](小写字母),    [:print:](可打印字符),    [:punct:](),
       [:space:](空格),  [:upper:](大写字母),    [:xdigit:]

次数匹配:该类字符之前的那个字符可以出现的次数;
                        *:其前面的字符可以出现任意次(0次,1次或多次);
                        \?:其前面的字符可有可无(0次或1次);
                        \+:其前面的字符至少出现一次(1次或多次);
                        \{m\}:其前面的字符必须出现m次;
                        \{m,n\}:其前面的字符至少出现m次,至多出现n次;(m<n)
                        \{,n\}:其前面的字符至少出现0次,至多出现n次;
                        \{m,\}:其前面的字符至少出现m次,多多益善;

在正则表达式中,表示任意长度任意字符的方式:.*

位置锚定字符:
                        行锚定:
                            行首锚定:^
                            行尾锚定:$
                        字锚定:
                            字首锚定:\<或\b
                            字尾锚定:\>或\b
                            \b:旧版本中的锚定方法,建议不使用;

对于正则表达式引擎来说,字是由非特殊字符组成的连续字符串;

分组与引用字符:
                        \(PATTERN\):将此PATTERN所匹配到的所有字符当作一个不可分割的整体来处理

在正则表达式引擎之中,有一系列的内置变量,这些变量会保存所有分组内的字符信息,用于后向引用;这些变量依次是:\1, \2, \3, ...

pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\)

\1:pattern2
                        \2:pattern4
                        \3:pattern5

\1:第一组小括号中的pattern匹配到的字符;
                        \2:第二组小括号中的pattern匹配到的字符;
                        ...

请找出在/etc/passwd中用户的UID和GID相同的用户账户;
                    ~]# grep ‘\(\<[[:digit:]]\+\>\).*\1‘ /etc/passwd

或:
                        \|

注意:\|将其左右两边的字符串当作整体对待;

A\|american  :A或american

请找出ifconfig命令的执行结果中数值在100-255之间的整数;

第一位:1         2
                    第二位:0-9        0-4  5
                    第三位:0-9        0-9  0-5

ifconfig | grep ‘\<\(1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>‘

grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

默认情况下,grep命令后面只允许有一个PATTERN;
        如果想要在一次grep所搜过程中写多个PATTERN,则需要使用-e选项;每个-e选项只能使用一个PATTERN作为参数;

将所需要的PATTERN写入到一个文件中,保证每行只有一个PATTERN;我们就可以使用-f FILE方式来实现多PATTERN匹配;

egrep:
        egrep [OPTIONS] PATTERN [FILE...]
            扩展的正则表达式元字符:
                字符匹配:
                    .
                    []
                    [^]

次数匹配:
                    *
                    ?
                    +
                    {m}
                    {m,n}
                    {m,}
                    {0,n}

位置锚定
                    ^
                    $
                    \<,\b
                    \>,\b

分组和引用:
                    ()
                    \1, \2, \3,...

或:
                    |

fgrep:PATTERN中所有的字符都被当作文本字符来处理;

其他的文本处理命令:
      wc:
          wc [OPTION]... [FILE]...
              -l:只显示行数
              -w:只显示字数
              -c:只显示字符数

cut:remove sections from each line of files
          能够被cut命令修剪的文件,一般都是具有一定结构或格式的文本文档;/etc/passwd
          cut OPTION... [FILE]...
              -d, --delimiter=DELIM:指定在实施修剪操作时所依赖的分隔符,默认是空白字符;
              -f, --fields=LIST:根据定义的分隔符来指定字段的编号;
                  地址定界使用方法:
                  #:选择被指定的单个字段;
                  #,#:离散的多个被指定的单个字段;
                  #-#:连续的多个被指定的字段;
              --output-delimiter=STRING:指定输出分隔符;

awk:
          awk -F "DELIMITER" ‘[/PATTERN/]{print $1,$2,...$NF}‘ FILE...
              -F "DELIMITER":指定字段分隔符,默认为空白字符;
              $1,$2,...,$NF:根据字段分隔符切割出来的文本片段都存放在相应的内部变量中;

sort:sort lines of text files,将文本文件按行继续排序,默认排序规则是按照ASCII表中的字符顺序进行,这个排序标准可修改;
          -r, --reverse:逆序排序
          -R, --random-sort:随机排序,这种随机算法是非常简陋的,不适用于复杂环境;
          -u, --unique:重复出现的行,只保留一行;(连续且完全相同的行叫重复),祛重;
          -n, --numeric-sort:以数字的数值大小进行排序;
          -t, --field-separator=SEP:指定字段分隔符;
          -k, --key=KEYDEF:指明根据哪个关键字段进行排序,一般和-t同时使用;

uniq:report or omit repeated lines
          -d, --repeated:只显示重复出现的行,而且每一组重复行只显示一行;
          -u, --unique:只显示不重复的行;
          -c, --count:在每行以前缀的方式显示重复行的重复次数;

diff:compare files line by line
          同一文件的不同修改版本;打补丁;

patch:apply changes to files
           patch [-R][-i patchfile] [file]

... ...

时间: 2024-08-06 11:54:19

shell编程基础(一)的相关文章

shell编程基础一(多种方法求值1+2+..+100)

#SHELL编程基础一(多种方法求值1+2+..+100)##为什么要学好shell shell脚本语言是实现linux系统管理及自动化运维所必备的重要工具,linux系统的底层及基础应用软件的核心大都涉及shell脚本的内容. 每一个合格的linux系统管理员或运维工程师,都需要能够熟练地编写shell脚本语言,并能够阅读系统及各类软件附带的shell脚本内容. 只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的工作,从而为个人的职场发展奠定较好的基础.# 本文的宗旨是熟

第十天:shell编程基础与编写Makefile

一:shell编程基础 shell定义:shell是一个作为用户与linux系统间接口的程序.它允许用户向操作系统输入需要执行的命令.shell有很多中,linux系统中shell为bash. shell编程可以看作是一堆命令的集合.和windows中的bat程序类似的脚本程序.为解释性语言. 第一个shell程序是判断两个数字的大小. 1 #!/bin/bash 2 3 num1=10 4 num2=9 5 6 if test $num1 -gt $num2 7 then 8 echo $nu

Linux学习之二十一-shell编程基础

Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Shell 脚本(shell script),是一种为 shell 编写的脚本程序 Shell 编程跟 java.php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了 Linux中的shell种类(shell解释器的种类

周期性任务计划,包管理,sed以及shell编程基础

周期性任务计划,包管理,sed以及shell编程基础 1.每12小时备份并压缩/etc/目录至/backup目录中,保存文件名称格式为,"etc-年-月-日-时-分.tar.gz"[[email protected] /]# crontab -e0 /12 /usr/bin/tar -zcf /data/backup/etc-$(date '+%Y-%m-%d--%H-%M').tar.gz /ect/*2.rpm包管理功能总结以及实例应用演示rpm是一个功能十分强大的软件包管理系统,

第七章,shell编程基础

更多笔记点击查看 Linux学习从入门到打死也不放弃,完全笔记整理(持续更新) http://blog.51cto.com/13683480/2095439 笔记整理开始时间:2018年4月12日11:37:35 本章内容: 编程基础 脚本基本格式 变量 运算 条件测试 配置用户环境 编程基础: 程序:指令+数据 程序编程风格: 过程式:以指令为中心,数据服务于指令 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤 一步一步实现,使用的时候一个一个依次调用就可以了 对象式:以数据为中

Linux Shell编程基础---国际象棋棋盘

这两天在学习一些shell编程的知识,在做到一道国际象棋的题目时,觉得有些意思,就将它写成博客. 先来看看国际象棋棋盘长啥样: 仔细想了会棋盘的分布规则,这个问题肯定有很多思路,我自己想到的是规则是1.将棋盘行数作为一个大循环,循环8次,每次循环根据行号的奇偶来确定格子颜色的次序:2.在单个行中,循环8次并判断列的奇偶数来确定打印颜色以上思路能够打印出最简单的棋盘,但是shell中一个空格的显示形状并非正方形,而且是空格的高度大于宽度.因此需要在单个棋盘的行的打印循环外在加一层控制打印空格行数的

linux基础学习-17-linux操作系统之Shell编程基础讲解

1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚本的内容.每一个合格的Linux系统管理员或运维工程师,都需要熟练的编写Shell脚本语言,并能够阅读系统及各类软件附带的Shell脚本内容.只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础. 1.2 学好Shell编程所需的基础知识

shell编程基础必知

shell编程 ################################################ 静态语言 动态语言 ################################################ 编程语言:机器语言,汇编语言,高级语言 ################################################ 面向对象的编程语言:sehll c 面向对象的编程语言:JAVA Python perl c++ ################

shell编程基础

for c in a b c d e f g;do echo $c; done 按顺序输出 for c in a b c d e f g;do tar czvf install.log.$c.tar.gz install.log ; done for c in {a..g}; do echo $c; done 和上面的一样 seq 1 10 列数字的 for i in {1..10}; do echo $i; done 字符串变量实例str='I love linux. I love unix

Linux(五)shell编程基础

一.Linux shell简介 1.shell概述 Shell 是用户与内核进行交互操作的一种接口,目前最流行的 Shell 称为 bash Shell          Shell 是一门编程语言<解释型的编程语言>,即 shell 脚本<就是在用 linux 的 shell 命令编程>,          Shell 是一种脚本语言,那么,就必须有解释器来执行这些脚本.          Unix/Linux 上常见的 Shell 脚本解释器有 bash.sh.csh.ksh