shell的基础语法和常用脚本
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
本文关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
创建Shell脚本
新建一个文件,
test.sh
,扩展名为sh,代表shell
文件第一行格式
#!/bin/bash
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
运行Shell脚本的方式
1,作为可执行程序,
将上面的代码保存为 test.sh,并 cd 到相应目录:
chmod +x ./test.sh #使脚本具有执行权限./test.sh #执行脚本
2,作为解释器参数
直接运行解释器,其参数就是shell脚本的文件名,如
/bin/bash test.sh
这种方式运行的脚本,就不需要在第一行指定解释器信息,写了也不作数
Shell 变量
定义变量:
var=\"abc\" #变量名和等号之间不能有空格
除了直接赋值,也可以用语句给变量赋值,如
for file in `ls /etc` #将/etc下目录的文件名循环出来
使用变量:
在变量名前加美元符即可
$
,把变量名用大括号括起来(这个适当情况可以省略)
echo ${var}var #这里不能省略
可以设置只读变量
#!/bin/bashvar=\"iphone6s\"readonly var #只读
删除变量
unset var #删除
shell字符串
单引号, 原样输出,变量在里面是无效的
双引号,可以有变量,可以出现转义字符
shell支持数组,用空格分开
数组名=(值1 值2 ... 值n)
可以不使用连续的下标,而且下标的范围没有限制。
读取数组:
${数组名[下标]}listone=${list[1]}
使用@符号,可以获取数组中的全部元素
echo ${list[@]}
获取数组长度和字符串长度:(名字前加**#** 号)
length=${#list[@]}
shell 传参
1,
$n
n是一个数字,从1开始,代表第几个传进来的参数,如
$1
代表第一个传进来的参数
$0
,代表在执行的文件名
2,特殊字符
参数处理 说明
$#
, 传递到脚本的参数个数
$*
, 以一个单字符串显示所有向脚本传递的参数。
如\”$*“用「”」括起来的情况、以\”$1 $2 … $n\”的形式输出所有参数。
$$
脚本运行的当前进程ID号
$!
后台运行的最后一个进程的ID号
$?
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
运算
1,基本运算
expr是一个表达式计算工具,表达式要被反引号“包含,表达式和运算符之间要有空格
#!/bin/bashvar=`expr 2 + 2`echo \"两数之和为 : $var\"
2,算数运算符
表达式要放在方括号中间,而且要有空格
如:
[ $a == $b ]
3,关系运算符
表达式要放在方括号中间,而且要有空格
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
#!/bin/basha=10b=20if [ $a -eq $b ]thenecho \" a 等于 b\"elseecho \" a 不等于 b\"fi
流程控制
1,if_ifelse_else格式
if condition1thencommand1elif condition2thencommand2elsecommandNfi
2,for循环
for var in item1 item2 ... itemNdocommand1command2...commandNdone
还有一种
for((a=1;a<=5;a++))docommand...done
3,while语句
#!/bin/bashint=1while(( $int<=5 ))doecho $intlet \"int++\"done
4,case语句
case 值 in模式1)command1;;模式2)command1;;*)echo \"包含所有的意外情况\";;esac
5,break和continue
break命令允许跳出所有循环(终止执行后面的所有循环)。
continue命令不会跳出所有循环,仅仅跳出当前循环。
常用shell脚本
1,tomcat启动脚本
[root@promote tmp]# vi tomcatstart.sh //创建一个shell脚本文件
#!/bin/bash#开启tomcatstart(){ #启动函数cd /opt/apache-tomcat-8.5.45./bin/startup.sh}close(){ #关闭函数cd /opt/apache-tomcat-8.5.45./bin/shutdown.sh}case $1 in #根据第一个输入的参数,进行流程控制start)start;;close)close;;*)echo \"please put start or close\";;esac
保存退出之后开始测试
[root@promote tmp]# chmod +x tomcatstart.sh #赋权[root@promote tmp]# ./tomcatstart.shplease put start or close[root@promote tmp]# ./tomcatstart.sh startUsing CATALINA_BASE: /opt/apache-tomcat-8.5.45Using CATALINA_HOME: /opt/apache-tomcat-8.5.45Using CATALINA_TMPDIR: /opt/apache-tomcat-8.5.45/tempUsing JRE_HOME: /opt/jdk1.8.0_221/jreUsing CLASSPATH: /opt/apache-tomcat-8.5.45/bin/bootstrap.jar:/opt/apache-tomcat-8.5.45/bin/tomcat-juli.jarTomcat started. #启动成功