Linux学习之shell编程

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


函数的调用

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,364评论 0 5
  • 1.创建文件夹 !/bin/sh mkdir -m 777 "%%1" 2.创建文件 !/bin/sh touch...
    BigJeffWang阅读 10,019评论 3 53
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,719评论 0 10
  • 本文是对Linux shell编程的一个学习比较,共包括如下章节的内容: 概述 基本语法 结构化语句 函数 小结 ...
    我是老薛阅读 816评论 0 5
  • 一,shell题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工...
    架构师小秘圈阅读 8,720评论 3 70