zoukankan      html  css  js  c++  java
  • shell-快速入门_批处理脚本编程语言

    1. Shell概述

    1.1. Shell是什么

    Shell是一门批处理脚本编程语言。

    批处理是什么?

    操作系统都分为(GUI)图形界面,命令界面(command)。

    命令操作的可以不用一一条执行。可以组命令同时执行。我们将多条命令同时执行的操作称为批处理。

    什么是脚本编程语言。

    1. 脚本语言是不需要就可以执行的编程语言。《解释型编程语言》
    2. 特征,任何的脚本语言是必须有宿主程序的。

     

    --JavaScript脚本语言。必须需要依赖浏览器才可以执行。所以浏览器就是JavaScript的宿主程序。

    --SQL脚本语言,必须需要数据库启动了才可以执行,SQL语言的宿主是数据库

    --Shell脚本语言,必须依赖linux的系统。linux系统就是它宿主程序。

     

    shell脚本,是批处理的程序,所以也可以使用任何的linux命令

    shell脚本,是一门脚本语言,所以它不需要编译直接执行

    shell脚本是一门编程语言,必须符合编写语言的特征。变量,常量,标识符,注释,判断,循环

     

    1.2. 语法结构

    问题:linux是有多种shell的语言的。如,bash shell csh 等。为什么有多种?

    答:原因是linux是一个开源的操作系统。不同的人都可以对它进行制定。功能稳定后可以提交合并到主核中。

    #!/bin/bash  ##指定使用的shellbash shell

    ##输出hello world

    echo “hello world”

    ##这是一行注释

    bash shell的注释是使用#,但我们建议使用##号。

    需求:使用root,在~目录的shell文件里面,创建一个 demo.sh shell脚本。输出hello world

    2. 变量

    2.1. 系统变量

    变量分为系统变量用户自定义变量

    所谓的系统变量就Linux系统自带的变量。

     

    如:$PWD$USER这种Linux系统自带的变量,我们称为系统变量。以及我们在profile设置的变量。

    需求:输出系统变量PWD

    使用 echo $PWD

    访问变量使用$访问,不管是系统变量函数,用户自定义变量。

    2.2. 用户自定义变量

    2.2.1. 语法

    变量=值 (例如STR=abc

    等号两侧不能有空格

    变量名称一般习惯为大写(不管学任何编程语言,保持语法风格和API的一致)

    使用变量: $STR

    注意:如果值是有空格等特殊字符串,必须有使用双引号或者单引号。

    2.2.2. 双引号和单引号有区别

         双引号仅将空格脱意,

         单引号会将变量引用比如$param脱意

    1. 设置a=aaa

    使用命令 a=aaa

        2.设置变量 b= “$a bbb”

    --仅将空格脱意的意思是指,除了空格字符串输出,其他的有特殊含义的字符还是转义输出的

     

        3.如果设置的变量b = ‘$a bbb’

    --变量引用脱意,所有的空格以及引用都字符串输出

     

    2.2.3. 有无export的区别

    当前shell有效的变量,当前shell文件内部调用

    不加 export的变量就是当前shell有效的变量,如果在一个shell脚本里面

    声明一个STR=aaa,shell脚本不可以调用该变量!!

    如果加一个shell脚本里面声明的变量使用了export。表示全局变量,shell脚本可以调用。

    --编写一个demo-03.sh

     

    --编写一个demo-04.sh

     

    --执行demo-03.sh,可以输出

     

    2.3. 反单引号赋值

    echo `ls -l` 。反单引号,就是Tab键的上一个键。

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

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

    2.4. 特殊变量

    $? 表示上一个命令退出的状态码

    状态码

    描述

    0

    命令成功结束

    1

    通用未知错误  

    2

    误用Shell命令

    126

    命令不可执行

    127

    没找到命令

    128

    无效退出参数

    128+x

    Linux信号x的严重错误

    130

    命令通过Ctrl+C控制码越界

    255

    退出码越界

    $$ 表示当前进程编号

    $0 表示当前脚本名称

    $n 表示n位置的输入参数(n代表数字,n>=1

    $# 表示参数的个数,常用于循环

    $*$@ 都表示参数列表 

    注:$*$@区别

    $* $@ 都表示传递给函数或脚本的所有参数

    ü 不被双引号" "包含时--

    $* $@ 都以$1  $2  $n 的形式组成参数列表

    ü 当它们被双引号" "包含时--

    "$*" 会将所有的参数作为一个整体,以"$1 $2 $n"的形式组成一个整串;

    "$@" 会将各个参数分开,以"$1" "$2" "$n" 的形式组成一个参数列表

    需求:编写一个段脚本。直接输出参数值,以及shell脚本的名字。

    #!/bin/bash

    echo "my file name is $0"

    echo "param 1 is $1"

    echo "param 2 is $2"

    echo "param count is $# "

    echo "param list $*"

    echo "param list $@"

    结果

     

    3. 运算符

    3.1. expr(可以忽略)

    --注意:默认情况下,shell的变量都是一个字符串。

    --如何让字符串都可以运算呢?

    答:可以使用expr命令。

    --注意事项:运算符之间必须要有空格。

    例如计算(23 )×4 的值

    --第一步

    S=`expr 2 + 3`

    --第二步

    --注意事项:*linux里面是一个通配符,所以需要转义

    expr $S * 4

    一步完成计算

    方案1 expr  `expr 2 + 3` * 4

    --注意;`也是一个特殊字符,表示$()的意思。如果在运算表达式里面,也需要转义

    方案2 echo `expr \`expr 2 + 3\` * 4`

    3.2. $(())

    ((C语言语法))里面的表达式,使用标准C语言的语法来操作运算符。

    ((1+2))

    (((2+3)*4))

    count=1

    ((count++))

    echo $count

     

    3.3. $[]

    一般用于逻辑运算。

    a=$[1+2]

    echo $a

    问题:Shell的语法为什么那么奇怪呢?

    答:就是当时写系统的临时想出来的解决方案。所以语法语法结构比较古老。

    4. 流程控制

    4.1. if语法

    --java 语法

    if (condition ){

        //statements

    }else if(condition ){

        //statements

    }else{

        //statements

    }

    语法结构

    if  condition then

      //statements

    elif condition then

       //statements

    else

      //statements

    fi

    示例:

      需求:编写程序,如果输入的参数为 root 输出欢迎语句,如果参数是sxt也输出欢迎语句

    否则,不认识你

    #!/bin/bash

    read -p "please input your name:" NAME   ## read命令用于从控制台读取输入数据

    ## printf '%s ' $NAME

    if [ $NAME = root ]

            then

                    echo "hello ${NAME},  welcome !"

            elif [ $NAME = ranger ]

                    then

                            echo "hello ${NAME},  welcome !"

            else

                    echo "SB, get out here !"

    fi

    注意事项:

    1. 关键字必须有换行
    2. []的对比判断,必须要有空格 如 [ $NAME = ranger ]
    3. 如果关键字不想换行可以使用;结束

    4.2. case语法

    --javacase语法

    switch (value)

    case val1:

      //statements

      break;

    case val2:

       //statements

      break;

    default

        //statements

      break;

    语法结构

    case <变量> in

    value1)

    //逻辑处理

    ;;

    value2)

    //逻辑处理

    ;;

    *)

    //逻辑处理

    esac

    需求:通过参数传值,如果是start ,输出 starting 如果是 stop ,输出stoping 否则,输出 (start|stop)

    示例

    case $1 in

    start)

    echo "starting"

    ;;

    stop)

    echo "stoping"

    ;;

    *)

    echo "Usage: {start|stop}"

    esac

    5. 循环

    5.1. while

    --语法结构

    while expression

    do

    command

    done

    示例

    #!/bin/bash

    read -p "请输入一个数:" NUM

    echo "$NUM"

    i=0

    sum=0

    while ((i< $NUM))

    do

         ((i++))

         sum=$(($sum+$i))

      done;

    echo "sum is $sum";

    注意事项:

    1. 分号和换行都是表示语句结束的意思。
    2. 最后的done必须要有一个空格或;

    5.2. for语法

    5.2.1. 方式一

    for N in 1 2 3

    do

    echo $N

    done

    for N in 1 2 3; do echo $N; done

    for N in {1..3}; do echo $N; done

    5.2.2. 方式二

    for ((i = 0; i <= 5; i++))

    do

    echo "welcome $i times"

    done

    for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done

    6. 案例-Tomcat开机自动启动的实现

    tomcat开机启动。

    1. 方案1,放在rc.local (不好)

    为什么不好,这样做,虽然tomcat启动了。但是在服务里面看不见。

    需求:让tomcat也可以使用service来管理。

    --注意,tomcat本身没有提供服务脚本。所以需要我们自定义实现。

    --注意:windows系统的编码linux是不同。所以从window复制过去的shell是有问题。

    可以通过 cat -A  <文件确认编码问题>

    编写脚本

    #!/bin/bash

    # This is a Tomcat Service

    # chkconfig: 2345 90 10

    # desricption: This is a Tomcat Service

    export JAVA_HOME=/opt/jdk1.8.0_181/

    case $1 in

     start)

       echo "Tomcat Service strating...."

       /opt/apache-tomcat-8.5.34/bin/startup.sh

       echo "SUCCESS!!!!"

       ;;

     stop)

       echo "Tomcat Service stoping...."

       /opt/apache-tomcat-8.5.34/bin/shutdown.sh

       echo "SUCCESS!!!!"

      ;;

     *)

       echo "(start|stop)"

    esac

    将脚本复制在 /etc/init.d/目录下,文件名为tomcat

    注意:tomcat文件必须有给所有人授予执行的权限

    如果成功。可以使用

    service tomcat start

    service tomcat stop

    测试。。。

    将服务加入到开机启动

    chkconfig --add tomcat

    查看增加是否成功

    chkconfig --list

    7. 总结

    1. 理解系统变量与用户自定义的区别
    2. 理解用户自定义变量,加export和没有export的区别
    3. 注意,变量的声明,等号两边不能有空格
    4. 注意 使用方括号 [] 每一个变量必须要有空格,注意等号使用的=,不是==
    5. 注意((写的是C语言的语法))
    6. 注意变量必须要使用$访问
    7. 注意可以使用换行或者;断句。要求如果不使用;断句。必须关键字需要断句的一定要换行。
    8. whilefor循环done后面有空格或者使用;结束。
    9. window的编号和linux是不同的。注意,使用cat -A检查
  • 相关阅读:
    电源跳闸或突然断电后Kafka启动失败问题
    Failure to find org.glassfish:javax.el:pom:3.0.1b06SNAPSHOT
    Idea中的maven工程运行Scala报Command execution failed
    Scala(一)入门
    HBase2.0.5
    GridView之CommandField的妙用——点击提示删除
    SharePoint 2010在新窗口打开文档库中的文件
    SharePoint 2010 使用后台代码向SP.UI.ModalDialog.showModalDialog传值
    SharePoint 2010 使用代码创建视图查询条件
    Sharepoint 2010 禁止用户在文档库的第一级(根)目录上传文件
  • 原文地址:https://www.cnblogs.com/aknife/p/11209516.html
Copyright © 2011-2022 走看看