shell-快速入门_批处理脚本编程语言

1. Shell概述

 

1.1. Shell是什么

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

 

 

批处理是什么?linux

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

 

命令操做的能够不用一一条执行。能够组命令同时执行。咱们将多条命令同时执行的操做称为批处理。数据库

 

 

什么是脚本编程语言。express

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

 

--JavaScript脚本语言。必须须要依赖浏览器才能够执行。因此浏览器就是JavaScript的宿主程序。apache

--SQL脚本语言,必须须要数据库启动了才能够执行,SQL语言的宿主是数据库编程

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

 

shell脚本,是批处理的程序,因此也可使用任何的linux命令浏览器

shell脚本,是一门脚本语言,因此它不须要编译直接执行tomcat

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\n' $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检查
相关文章
相关标签/搜索