shell-快速入门_批处理脚本编程语言
1. Shell概述
1.1. Shell是什么
Shell是一门批处理脚本编程语言。
批处理是什么?
操作系统都分为(GUI)图形界面,命令界面(command)。
命令操作的可以不用一一条执行。可以组命令同时执行。我们将多条命令同时执行的操作称为批处理。
什么是脚本编程语言。
- 脚本语言是不需要就可以执行的编程语言。《解释型编程语言》
- 特征,任何的脚本语言是必须有宿主程序的。
--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脱意
使用命令 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 |
注意事项:
- 关键字必须有换行
- []的对比判断,必须要有空格 如 [ $NAME = ranger ]
- 如果关键字不想换行可以使用;结束
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"; |
注意事项:
- 分号和换行都是表示语句结束的意思。
- 最后的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,放在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. 总结
- 理解系统变量与用户自定义的区别
- 理解用户自定义变量,加export和没有export的区别
- 注意,变量的声明,等号两边不能有空格
- 注意 使用方括号 [] 每一个变量必须要有空格,注意等号使用的=,不是==
- 注意((写的是C语言的语法))
- 注意变量必须要使用$访问
- 注意可以使用换行或者;断句。要求如果不使用;断句。必须关键字需要断句的一定要换行。
- while,for循环done后面有空格或者使用;结束。
- window的编号和linux是不同的。注意,使用cat -A检查
shell-快速入门_批处理脚本编程语言的更多相关文章
- Shell 快速入门(十八):特殊符号的使用
在 Shell 语言中,经常会看到中括号和括号组成的特殊标识,例如:[].[[]].(()).$(()).().这些符号经常使我们非常迷惑,弄清楚它们之间的作用和区别非常必要. 在开始之前,我们先来学 ...
- Spring_MVC_教程_快速入门_深入分析
Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf Spring ...
- 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2 任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...
- Robot Framework 快速入门_中文版
目录 介绍 概述 安装 运行demo 介绍样例应用程序 测试用例 第一个测试用例 高级别测试用例 数据驱动测试用例 关键词keywords 内置关键词 库关键词 用户定义关键词 变量 定义变量 使用变 ...
- 【笔记目录1】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
当前标签: ASP.NET Core快速入门 共2页: 1 2 下一页 任务50:Identity MVC:DbContextSeed初始化 GASA 2019-03-02 14:09 阅读:16 ...
- Linux Bash Shell 快速入门
BASH 的基本语法 最简单的例子 —— Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1 ...
- Linux Bash Shell快速入门 (三)
forfor 循环结构与 C 语言中有所不同,在 BASH 中 for 循环的基本结构是: for $var in dostatmentsdone 其中 $var 是循环控制变量, 是 $var 需要 ...
- shell 快速入门
1: 脚本开始行 #!/bin/bash 这一行表明,不管用户选择的是那种交互式shell,该脚本需要使用bash shell来运行. 由于每种shell的语法大不相同,所以这句非常重要. 2:变量 ...
- 1.shell快速入门
shell是什么?shell是一个命令行解释器,它提供了一个像linux内核发送请求以便运行程序的界面系统程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序.说白了,shell就是用来和内 ...
随机推荐
- bugku insertsql
题目链接 0X00题目给出的PHP代码 error_reporting(0); function getIp(){ $ip = ''; if(isset($_SERVER['HTTP_X_FORWAR ...
- 4 Linux文件与目录管理
Linux的目录文件结构为树状结构,最顶级目录为根目录 / 其他目录通过挂载可以将他们添加到树中,通过解除挂载可以移除他们 绝对路径: 根目录开始 eg: /usr/share/doc 相对路径: 不 ...
- SAP云平台和第三方CRM解决方案(火锅)互联
光看封面配图,这篇文章很容易被误认为在讲成都的美食之一:火锅. SAP成都研究院坐落在被联合国教科文组织授予过"美食之都"称号的成都,所在的天府软件园,半径1公里左右星罗棋布着很多 ...
- 02篇ELK日志系统——升级版集群之kibana和logstash的搭建整合
[ 前言:01篇LK日志系统已经把es集群搭建好了,接下来02篇搭建kibana和logstash,并整合完成整个ELK日志系统的初步搭建. ] 1.安装kibana 3台服务器: 192.168.2 ...
- C++ OpenSSL 之四:CER转换为PEM
1.等同于使用: openssl x509 -in "cer_path" -inform DER -out "save_path" -outform PEM ...
- 找出所有文件最小可resize尺寸
--找出所有文件最小可resize尺寸 SELECT a.file_id, CEIL( ( NVL( hwm,1 ) * blksize ) / 1024 / 1024 ) smallest_M, C ...
- day 46
目录 CSS样式操作 给字体设置长宽 字体颜色 语义 背景图片 边框 display 盒子模型 浮动(**************) 浮动带来的影响 clear overflow溢出属性 定位 位置的 ...
- JMETER 生成测试报告
JMETER测试报告样例 JMETER 提供的生成测试报告功能,能够生成漂亮的HTML测试报告. 上图是测试统计图 20个用户并发,测试时长一分钟,发起流程320次,没有出错,TPS为6.5,平均发起 ...
- spring项目使用mave将第三方jar包打进war包中
背景:一个标准的ssm项目,需要使用到第三方jar,现需要将项目发布到liunx的服务器上,将项目打成war包,第三方war包也需要打进去 首先是直接打包,发现第三方jar包并没有打进去......蛋 ...
- grep基本详细使用
过滤文件类容---grep grep正则表达式应用: #grep [option]"pattern" 文件名称 pattern模式 由普通字符和正则表达式的元字符组构成的条件 简单 ...







