美文网首页
Linux学习之shell编程

Linux学习之shell编程

作者: 真香IT | 来源:发表于2019-10-10 22:04 被阅读0次
    shell编程

    写在前面

            Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。 

     
     【1】概述

            Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

    shell作用

            Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。Shell是解释执行的脚本语言,在Shell中可以调用Linux系统命令。

            假如有个功能,比如向数据库导入数据,java编程和shell都能够完成我们的需求,

            有什么区别?都能够完成需求,但是如果需求稍微变化,shell更能轻松应对变化,能够在运行环境随时调试,随时变动,改变脚本不用经过编译,可以实时看到效果。

            如果功能复杂,流程繁琐,逻辑较多,那么这时候就可以用java编写功能。

    【2】 shell脚本的执行方式

            echo输出内容到控制台

            (1)基本语法:

                echo [选项] [输出内容]

            (2)案例

                [hadoop@hadoop003 sbin]$ echo "helloworld"

                helloworld

            脚本格式

            (1)脚本以  #!/bin/bash  开头,指定用bash来解释我们编写的shell脚本。

            (2)脚本必须有可执行权限

            第一个Shell脚本

            (1)需求:创建一个Shell脚本,输出helloworld

            (2)实操:

            [hadoop@hadoop003 datas]$ touch helloworld.sh

            [hadoop@hadoop003 datas]$ vi helloworld.sh

            在helloworld.sh中输入如下内容

            #!/bin/bash 

            echo "helloworld"

    helloworld

            脚本的常用执行方式

                第一种:输入脚本的绝对路径或相对路径

                (1)首先要赋予helloworld.sh 脚本的+x权限

                [hadoop@hadoop003 datas]$ chmod 777 helloworld.sh

                或者

                [hadoop@hadoop003 datas]$ chmod u+o helloworld.sh

            (2)执行脚本

                /root/helloWorld.sh

                ./helloWorld.sh

            第二种:bash或sh+脚本(不用赋予脚本+x权限)

                sh /root/helloWorld.sh

                sh helloWorld.sh

    【3】shell中的变量

            Linux Shell中的变量分为,系统变量和用户自定义变量。

            系统变量:$HOME、$PWD、$SHELL、$USER等等

            显示当前shell中所有变量:set

    set

    【3.1】定义变量

        基本语法:

        (1)定义变量:变量=值

        (2)撤销变量:unset 变量

        (3)声明静态变量:readonly变量,注意:不能unset

        变量定义规则

        (1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。

        (2)等号两侧不能有空格

        (3)变量名称一般习惯为大写

        空格问题:

        案例

            (1)定义变量A

                A=8

            (2)撤销变量A

                unset A     

            (3)声明静态的变量B=2,不能unset

                readonly B=2 

            (4)可把变量提升为全局环境变量,可供其他shell程序使用

                export 变量名 

    【3.2】 将命令的返回值赋给变量

            (1)A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A

    反引号

            (2)A=$(ls -la) 等价于反引号

    【3.3】 设置环境变量

        基本语法:

        (1)export 变量名=变量值 (功能描述:设置环境变量的值)

        (2)source 配置文件 (功能描述:让修改后的配置信息立即生效)

        (3)echo $变量名 (功能描述:查询环境变量的值)

        案例:

        (1)在/etc/profile文件中定义JAVA_HOME环境变量

            export JAVA_HOME=/opt/module/jdk1.8.0_144

            export PATH=$PATH:$JAVA_HOME/bin

        (2)查看环境变量JAVA_HOME的值

            [hadoop@hadoop003 datas]$ echo $JAVA_HOME

            /opt/module/jdk1.8.0_144

    【3.4】 位置参数变量

        基本语法

            $n (功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}。)

            $* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)

            $@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)

            $# (功能描述:这个变量代表命令行中所有参数的个数)

        案例

        (1)输出输入的的参数1,参数2,所有参数,参数个数


            #!/bin/bash

            echo "$0  $1  $2"

            echo "$*"

            echo "$@"

            echo "$#"


        (3)$*与$@的区别

    diff

            #!/bin/bash

            for i in "$*"

            #$*中的所有参数看成是一个整体,所以这个for循环只会循环一次

            do

                    echo "The parameters is: $i"

            done

            x=1

            for y in "$@"

            #$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次

            do

                    echo "The parameter$x is: $y"

                    x=$(( $x +1 ))

            done

    result

    【3.5】 预定义变量

        基本语法:

        $? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

        $$ (功能描述:当前进程的进程号(PID))

        $! (功能描述:后台运行的最后一个进程的进程号(PID))

        案例


    预定义变量

             #!/bin/bash

            echo "$$"

            ./helloworld.sh &

            echo "$!"

            echo "$?"

    预定义变量

    【4】运算符

        基本语法:

        (1)“$((运算式))”或“$[运算式]”

        (2)expr m + n

        注意expr运算符间要有空格

        (3)expr m - n

        (4)expr  \*, /, %    乘,除,取余

        案例:计算(2+3)X4的值

        (1)采用$[运算式]方式

            [root@hadoop003 datas]# S=$[(2+3)*4]

            [root@hadoop003 datas]# echo $S

        (2)expr分步计算

            S=`expr 2 + 3`

            expr $S \* 4

        (3)expr一步完成计算

            expr `expr 2 + 3` \* 4

    【5】 条件判断

        【5.1】 判断语句

            基本语法:

                [ condition ](注意condition前后要有空格)

                #非空返回true,可使用$?验证(0为true,>1为false)

            案例:

                [ hadoop ] 返回true

                [ ] 返回false

        【5.2】常用判断条件

            两个整数之间比较

            = 字符串比较

            -lt 小于 less than

            -le 小于等于

            -eq 等于  equal

            -gt 大于great than

            -ge 大于等于 greant than equal

            -ne 不等于not equal

        按照文件权限进行判断

            -r 有读的权限

            -w 有写的权限

            -x 有执行的权限

        按照文件类型进行判断

            -f 文件存在并且是一个常规的文件

            -e 文件存在

            -d 文件存在并是一个目录

        案例

        (1)23是否大于等于22

            [ 23 -ge 22 ]

        (2)student.txt是否具有写权限

            [ -w student.txt ]

        (3)/root/install.log目录中的文件是否存在

            [ -e /root/install.log ]

    【6】 流程控制

        【6.1】 if判断

        基本语法:注意if后边有空格

            if [ 条件判断式 ];then

              程序

            fi

            或者

            if [ 条件判断式 ]

              then

            程序

            fi

        注意事项:(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格,if和[之间,elif和[之间也要有空格

        案例,then另起一行,或者if最后的]后加分号


    if

         #!/bin/bash

        if [ $1 -eq "123" ]

        then

                echo "123"

        elif [ $1 -eq "456" ]

        then

                echo "456"

        fi


        【6.2】 case语句

        基本语法:

            case $变量名 in

              "值1")

            如果变量的值等于值1,则执行程序1

                ;;

              "值2")

            如果变量的值等于值2,则执行程序2

            ;;

          …省略其他分支…

          *)

            如果变量的值都不是以上的值,则执行此程序

            ;;

        esac

        案例


    case

              !/bin/bash

              case $1 in

            "1")

                    echo "1"

            ;;

            "2")

                    echo "2"

            ;;

            *)

                    echo "other"

            ;;

           esac


    【6.3】 for循环

        基本语法1:

        for 变量 in 值1 值2 值3…

          do

            程序

          done

        案例:

        (1)打印输入参数

            #!/bin/bash

            #打印数字

            for i in "$*"

            do

                  echo "The num is $i "

            done

            for j in "$@"

                do

                    echo "The num is $j"

                done

        基本语法2:

        for (( 初始值;循环控制条件;变量变化 ))

          do

            程序

          done

        案例

        (1)从1加到100


    for

       #!/bin/bash

        s=0

        for((i=1;i<=100;i++))

        do

                s=$[$s+$i]

        done

        echo "$s"


    【6.4】 while循环

        基本语法:

        while [ 条件判断式 ]

          do

            程序

          done

        案例

        (1)从1加到100


    while

            #!/bin/bash

            s=0

            i=1

            while [ $i -le 100 ]

            do

                s=$[$s+$i]

                i=$[$i+1]

            done

            echo $s


    【7】 read读取控制台输入

        基本语法:

        read(选项)(参数)

        选项:

            -p:指定读取值时的提示符;

            -t:指定读取值时等待的时间(秒)。

        参数

            变量:指定读取值的变量名

        案例

            读取控制台输入的名称

            #!/bin/bash

            read -t 7 -p "please input your name in 7 s" NAME

            echo $NAME

    【8】 函数

        【8.1】 系统函数

        basename基本语法,获取基本名称

        basename [pathname] [suffix]

        basename [string] [suffix]  (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

        选项:

        suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

        案例

        [hadoop@hadoop003 opt]$ basename /opt/test.txt

        test.txt

        [hadoop@hadoop003 opt]$ basename /opt/test.txt .txt

        test

        注意:该命令只是处理的字符串,不管文件是否存在

        dirname基本语法

        dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

        案例

        [hadoop@hadoop003 opt]$ dirname /opt/test.txt

        /opt

        注意:该命令只是处理的字符串,不管文件是否存在

    【8.2】 自定义函数

        基本语法:

        [ function ] funname[()]

        {

        Action;

        [return int;]

        }

        funname

        注意:

        (1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。

        (2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255),也就是说return后的范围是0-255.

        案例

        (1)计算输入参数的和

        将结果在函数里面打印出来。


         #!/bin/bash

        function sum()

        {

            s=0

            s=$[ $1 + $2 ]

            echo "$s"

        }

        read -p "Please input the number1: " n1;

        read -p "Please input the number2: " n2;

        sum $n1 $n2;

        或者将结果在函数外边打印出来。

        #!/bin/bash

        function sum()

        {

            s=0

            s=$[ $1 + $2 ]

        }

        read -p "Please input the number1: " n1;

        read -p "Please input the number2: " n2;

        sum $n1 $n2;

        echo $s

    函数的调用

    相关文章

      网友评论

          本文标题:Linux学习之shell编程

          本文链接:https://www.haomeiwen.com/subject/ekzapctx.html