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  ##指定使用的shell是bash 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命令。

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

例如计算(2+3 )×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语法

--java的case语法

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. while,for循环done后面有空格或者使用;结束。
  9. window的编号和linux是不同的。注意,使用cat -A检查

shell-快速入门_批处理脚本编程语言的更多相关文章

  1. Shell 快速入门(十八):特殊符号的使用

    在 Shell 语言中,经常会看到中括号和括号组成的特殊标识,例如:[].[[]].(()).$(()).().这些符号经常使我们非常迷惑,弄清楚它们之间的作用和区别非常必要. 在开始之前,我们先来学 ...

  2. Spring_MVC_教程_快速入门_深入分析

    Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf Spring ...

  3. 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总

    当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2  任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...

  4. Robot Framework 快速入门_中文版

    目录 介绍 概述 安装 运行demo 介绍样例应用程序 测试用例 第一个测试用例 高级别测试用例 数据驱动测试用例 关键词keywords 内置关键词 库关键词 用户定义关键词 变量 定义变量 使用变 ...

  5. 【笔记目录1】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总

    当前标签: ASP.NET Core快速入门 共2页: 1 2 下一页  任务50:Identity MVC:DbContextSeed初始化 GASA 2019-03-02 14:09 阅读:16 ...

  6. Linux Bash Shell 快速入门

    BASH 的基本语法 最简单的例子 —— Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1     ...

  7. Linux Bash Shell快速入门 (三)

    forfor 循环结构与 C 语言中有所不同,在 BASH 中 for 循环的基本结构是: for $var in dostatmentsdone 其中 $var 是循环控制变量, 是 $var 需要 ...

  8. shell 快速入门

    1: 脚本开始行 #!/bin/bash 这一行表明,不管用户选择的是那种交互式shell,该脚本需要使用bash shell来运行. 由于每种shell的语法大不相同,所以这句非常重要. 2:变量 ...

  9. 1.shell快速入门

    shell是什么?shell是一个命令行解释器,它提供了一个像linux内核发送请求以便运行程序的界面系统程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序.说白了,shell就是用来和内 ...

随机推荐

  1. QML官方文档:Qt Quick Controls 1和2对比

    Qt Quick Controls有1和2两个版本,在程序中会看到好多1和2版本混合使用的情况. 原文:https://doc.qt.io/qt-5/qtquickcontrols2-differen ...

  2. IOS—— strong weak retain assign 学习

    转自:http://wenzongliang.iteye.com/blog/1746604 简单讲strong等同retain weak比assign多了一个功能,当对象消失后自动把指针变成nil,好 ...

  3. aps系统切换切记“三要三不要”

    APS系统实施到将要切换时,成功已经近在咫尺,不过还有咫尺天涯的说法,在最后阶段栽跟头也不鲜见. 切换时需要做些什么,不要做些什么,小编总结了三要三不要. 一.要充分准备数据,不要偷工减料 APS系统 ...

  4. Js中replace替换所有*

    var t = '***感**谢**有**你***'; var r = t.replace(/\*/g,''); //\为转义字符 g表示全局 console.log(r) //感谢有你

  5. AIX运维常用命令

    目前传统的磁盘管理仍有不足:如果下Unix系统中的存储容量需要扩展,文件系统就必须停止运行,然后通过重构分区的手段来进行分区和文件系统的扩容.一般采用的方法是先备份该文件系统并删除其所在的分区,然后重 ...

  6. 搭建Ceph分布式存储

    环境: 系统 IP地址 主机名(登录用户) 承载角色 Centos 7.4 64Bit 1611 10.199.100.170 dlp(yzyu) ceph-client(root) admin-no ...

  7. 织梦dedecms后台文件media_add.php任意上传漏洞解决办法

    织梦在安装到阿里云服务器后阿里云后台会提示media_add.php后台文件任意上传漏洞,引起的文件是后台管理目录下的media_add.php文件,下面跟大家分享一下这个漏洞的修复方法: 首先找到并 ...

  8. mdk编译器学习笔记(1)——序

    这两天,学习了keil-mdk编译器的特性,这基本上独立于c语言语法,平时基本上都在强调c语言的学习,但是编译器的学习我们也要注重,类似于gcc一样,不也有很多网上的资料,讲述gcc的特性和用法吗.作 ...

  9. 掌握Visual Studio断点

    我知道你现在在想什么.断点?真的吗?关于断点有什么需要掌握的?你按F9然后停在代码行.如果你是这么想的,这篇文章是给你的:继续读 Visual Studio提供了一组相当丰富的断点类型和操作,可以使您 ...

  10. python源码解剖

    print()本身就是用了多态:不同类型的对象,其实是调用了自身的print()方法 多态:动物 狗1 = new狗() 用公共的部分来指定类型,实则是调用各自的属性 创建对象有两种方式: 通过C A ...