shell命令及编写脚本

#####################1.shell简介#####################################################3

Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。 

实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。 

shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。 
shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。

shell脚本(能运行的文本)

python是写脚本的语言。脚本为解释性语言,其他高级语言为描述性语言

脚本运行效率低。不如高级语言。(创造性开发语言,创造新的东西)

脚本解释器是一个shell。

shell脚本保存执行动作,用脚本判定命令的执行条件,用脚本来实现动作的批量执行。

 脚本是解释性语言,脚本内容需要解释器解释,不需要编译可以直接用,但运行效率低,用于记录系统命令,是以文本形式存在的 

C和JAVA等是描述性语言,是将动作描述给系统,运行效率高


############################2.shell脚本基础入门#################################################

脚本一般以.sh后缀,但没有强制要求。

eg:

    vim hello.c   写脚本

           #include<stdio.h>

            main()

            {

                 printf("hello world\n");

             }

           shell命令及编写脚本

    yum install gcc -y    ####安装解释器

    gcc hello.c  ###生成默认文件a.out    注意:cat a.out查看到的乱码为解释器转换后的内容

      shell命令及编写脚本

       shell命令及编写脚本

    gcc hello.c -o hello   ###指定生成文件hello

   执行脚本:

      法一(没有添加执行权限下):sh  ***.sh

      法二(有执行权限,已绝对路径方式):

                chmod +x hello.sh(给权限)

                ./hello   (绝对路径)

                shell命令及编写脚本

vim hello.sh(写规范脚本)

       #!/bin/bash (先执行这个,加载对写的内容的转换为电脑可识别的)

          echo hello world

        执行:sh hello.sh

             或者chmod +x hello.sh  /mnt/hello.sh

    可以给一个不会结束的脚本(watch -n 1 date),再ctrl+c,再ps f查看到脚本的具体命令及/bin/*****

     shell命令及编写脚本

插播:在虚拟机下,可以cd /root/Desktop到桌面

用脚本输出主机IP:脚本里写ifcinfig eth0 | grep inet

在脚本的#!/bin/bash之前一般会有注释(author,date,version等等)

那么如何写呢?(每写一个脚本都要写注释太麻烦,可在/etc/vimrc下添加配置文件,永久有效)

shell命令及编写脚本

第一种(按快捷键显示注释)

这个注意:1.同行添加

        2.实时时间显示

        3.map<F4>    ___(快捷键F4显示注释)

vim /etc/vimrc编写完成后,试着建立一个脚本,按F4,验证

shell命令及编写脚本

shell命令及编写脚本

第二种(新脚本自动显示注释,旧脚本不再添加,以免重复添加)

    注释掉map<F4>......这一行(在map前加左双引号即可“map)

    然后在紧接的下一行写:autocmd Buf*** ** ******

 shell命令及编写脚本

如何检查两个脚本的不同

       diff命令是用来比较两个文件或目录的不同

shell命令及编写脚本

       eg:

         vim westos

                    hello 123

         vim westos2

                    helo 123

                    westos

         diff westos westos1(注意是和第二个文件(westos1)为基础比较不同

                    1a2

                    > westos表示文件1添加westos就和文件2相同。

      shell命令及编写脚本

      shell命令及编写脚本

         a表示添加,c表示更改,d表示删除,<表示第一个文件中的内容,>表示 第二个文件中的内容。

   shell命令及编写脚本

打补丁:

        1)给脚本(文件)打补丁

         diff -u westos westos1(比较两者不同,并输出补丁)

         diff -u westos westos1 > westos.path(将补丁存入westos.path)

          yum install patch -y(安装打补丁的软件)

          patch westos westos.path(给第一个脚本添加补丁,修改为和第二个脚本一样的内容。并且第一个脚本原内容不会保留)

          path -b westos westos.path(给第一个脚本添加补丁,修改为和第二个脚本一样的内容。并且第一个脚本原内容会保留,保留在生成的新文件westos.orig中)

           shell命令及编写脚本

           shell命令及编写脚本

         2)给目录打补丁

           mkdir linux

           mkdir unix

           touch linux/westos

           diff -r linux/ unix/(比较两目录中的文件差别)

           

cut命令多用于字符截取

          cut -d 指定分隔符

          cut -f 1,7  指定截取第一列和第七列

          cut -f 1-7  指定截取第一列到第七列

          -d和-f经常是一块使用的)

           cut -d : -f 1 passwd

           cut -d : -f 1,7 passwd

          cut -c 1,4  指定截取第一个字符和第七个字符

          cut -c 1-4   指定截取第一个字符到第七个字符

eg:执行脚本ip_show.sh,显示本机ip

vim ip_show.sh

        ifconfig eth0 | grep "inet"|cut -d " " -f 10

        或者ifconfig eth0 | awk -F " " '/inet\>/{printf $2}'

awk:报告生成器(inet表示inet这行,$2指本行第二列)

sh -x ip_show.sh(如果脚本错误,显示脚本具体错误信息,+表示命令,无+的表示错误信息输出,对应的+那一行命令错误)

 shell命令及编写脚本

shell命令及编写脚本

shell命令及编写脚本

shell命令及编写脚本

&&(true)和||(fause)

           &&用来执行条件成立后执行的命令

           ||用来执行条件不成立后执行的命令

        eg:

           ping -c1 -w1 172.25.254.100 &> /dev/null && echo 172.25.254.100 is up || echo 172.25.254.100 is down

            shell命令及编写脚本

       shell命令及编写脚本

sort命令多用于字符排序

        sort -n 纯数字排序

        sort -r 倒序

        sort -u 去掉重复数字

        sort -o 输出到指定文件中

        sort -t 指定分隔符

        sort -k 指定要排序的列

        eg:sort -urn westos -o file

          shell命令及编写脚本

           sort -t : -k 2 westos

           

uniq命令对重复字符作相应的处理(一般和sort共用)

         uniq -u 显示唯一的行的数字

         uniq -d 显示重复的行的数字

         uniq -c 每行显示一次并统计重复次数

         eg:sort -n westos | uniq -c

                  1    1

                  3    2

                  1    5

                  次数 数字

             sort -n westos | uniq -d

                      2

                      5

             sort -n westos | uniq -u

                      1

             shell命令及编写脚本

test命令和[]等同

        test "&A"="$B" 等同["&A"="$B"]

        ["&A"="$B"]相等

        ["&A"!="$B"]不相等

        ["&A"-eq"$B"]相等

        ["&A"-ne"$B"]不相等

        ["&A"-le"$B"]小于等于

        ["&A"-lt"$B"]小于

        ["&A"-ge"$B"]大于等于

        ["&A"-gt"$B"]大于

         eg:a=1

            b=1

            test "$a"="$b" && echo yes || echo no

            shell命令及编写脚本

            echo $c

            [-z "$c"]&& echo yes || echo no   (判断$c是否为空,为空输出为yes)

            [-n "$c"]&& echo yes || echo no    (判断$c是否不为空,为空输出为no)

             shell命令及编写脚本      

 

编写脚本,判断ip主机是否存在,并错误命令输入格式给出提示

         #!/bin/bash

         [-z "$1"]&&{

                  echo “please give me a ipaddress!!“

                  echo 1   //正常退出

            }

         ping -c1 -w1 $1 &> /dev/null && {

                  echo "$1 is up"

             }||{

                  echo "$1 is down"

             }

       shell命令及编写脚本

编写脚本,判断输入数字是否在0~10之间,并错误命令输入格式给出提示

           #!/bin/bash

         [-z "$1"]&&{

                  echo ”please input a number after script!!“

                  echo 1   //正常退出

            }

         [ "$1" -gt "0" -a "$1" -lt "10" ]&& {     —a表示与,-o表示或

                  echo "$1 is between 1~10"

             }||{

                  echo "$1 is not between 1~10"

             }

          shell命令及编写脚本

["file1" -ef "file2"]   ###判断两个文件编号是否相同

      eg: touch file

          ln /mnt/file /mnt/file1   (ln表示软链接,本例创建file1软链接)

          ####ln之后file和file1的编号相同

          测试:["/mnt/file" -ef "/mnt/file1"]&& echo yes || echo no

         shell命令及编写脚本

["file1" -ot "file2"]    ###判断两个文件创建时间先后,若file1早与file2,则输出yes;

                            -o可理解为old

          eg:

             测试:["/mnt/file" -ot "/mnt/file1"]&& echo yes || echo no

["file1" -nt "file2"]    ###判断两个文件创建时间先后,若$1早于$2为no,否则为yes;

                             -n可理解为new

           eg:

             测试:["/mnt/file" -nt "/mnt/file1"]&& echo yes || echo no

        shell命令及编写脚本

test命令

     [-e "file"]  判断文件是否存在

      [-f "file"] 判断文件是否是普通文件

      [-L "file"] 查看是否是软链接

      [-S "file"] 查看是否是套接字

      [-b "file"] 查看是否是块设备(block device)

      [-d "file"] 查看是否为目录

      [-c "file"] 查看是否是字符文件

    eg:可编写一个脚本:vim file.sh

         #!/bin/bash

          ["$1" "/mnt/file"]&& echo yes || echo no

        在终端cd /mnt/

             ls   无file

             sh file.sh -e   判断文件不存在

             touch file

             sh file.sh -e   判断文件存在

             sh file.sh -f    判断文件是普通文件

             sh file.sh -L     查看不是软链接

             rm  -fr file

             ln -s /mnt/file.sh /mnt/file

             ll

             sh file.sh -L  查看是软链接

             sh file.sh -S  查看不是套接字

             yum install mariadb-server -y

             systemctl start mariadb

             ls /var/lib/mysql/

             ll

             cp /var/lib/mtsql/mysql.sock /mnt/file

             rsync -D /var/lib/mtsql/mysql.sock /mnt/file  (rsync作用(可能是传输)

             ll

             sh file.sh -S  查看是套接字

             sh file.sh -b   查看不是块设备

             rm -fr file

             rsync -D /dev/vdb /mnt/file

             sh file.sh -b   查看是块设备

             rm -fr /mnt/file

             mkdir /mnt/file

             sh file.sh -d   查看是目录

              sh file.sh -c  查看不是字符文件

              rm -fr /mnt/file

             rsync -D /dev/pts/1 /mnt/file

             ll

             sh file.sh -c  查看是字符文件  

 

编写一个脚本,判断文件类型

        #!/bin/bash

        [ -z "$1" ]&&{

               echo "please input a file name after script!!"

               exit 1

              }

        [-e "$1" ]||{

               echo "$1 is not exist!!"

               exit 0

              }

        [-L "$1" ]&&{

               echo "$1 is a link"

               exit 1

              }

        以此类推写下去.................................

     :wq

 shell命令及编写脚本

tr命令作用是改变大小写

       tr 'a-z' 'A-Z' < test.sh (将此脚本小写全部转换为大写)

       tr 'A-Z' 'a-z'  < test.sh (将此脚本大写全部转换为小写)

      eg:

       编写一个脚本,输入无论是大写还是小写都能识别

       #!/bin/bash

       WORD=$(echo $1 | tr 'A-Z' 'a-z')

       [ "$WORD"="hello" ]&&{

                 echo yes

           }||{

                 echo no

           }

       测试:sh test.sh hello     输出为yes

                sh test.sh HELLO     输出也为yes

  shell命令及编写脚本

  shell命令及编写脚本

shell命令及编写脚本

shell命令及编写脚本