Linux学习之shell编程

Linux学习之shell编程_第1张图片
shell编程

写在前面

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

 
 【1】概述

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


Linux学习之shell编程_第2张图片
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


Linux学习之shell编程_第3张图片
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


Linux学习之shell编程_第4张图片
反引号

        (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)$*与$@的区别


Linux学习之shell编程_第5张图片
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


Linux学习之shell编程_第6张图片
result

【3.5】 预定义变量

    基本语法:

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

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

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

    案例



Linux学习之shell编程_第7张图片
预定义变量

         #!/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最后的]后加分号



Linux学习之shell编程_第8张图片
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

    案例



Linux学习之shell编程_第9张图片
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



Linux学习之shell编程_第10张图片
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



Linux学习之shell编程_第11张图片
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)计算输入参数的和

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



Linux学习之shell编程_第12张图片

     #!/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编程_第13张图片
函数的调用

你可能感兴趣的:(Linux学习之shell编程)