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/bash
var="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/bash
var=`expr 2 + 2`
echo "两数之和为 : $var"
2,算数运算符
表达式要放在方括号中间,而且要有空格
如: [ $a == $b ]
3,关系运算符
表达式要放在方括号中间,而且要有空格
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
#!/bin/bash
a=10
b=20
if [ $a -eq $b ]
then
echo " a 等于 b"
else
echo " a 不等于 b"
fi
流程控制
1,if_ifelse_else格式
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
2,for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
还有一种
for((a=1;a<=5;a++))
do
command...
done
3,while语句
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "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
#开启tomcat
start(){ #启动函数
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.sh
please put start or close
[root@promote tmp]# ./tomcatstart.sh start
Using CATALINA_BASE: /opt/apache-tomcat-8.5.45
Using CATALINA_HOME: /opt/apache-tomcat-8.5.45
Using CATALINA_TMPDIR: /opt/apache-tomcat-8.5.45/temp
Using JRE_HOME: /opt/jdk1.8.0_221/jre
Using CLASSPATH: /opt/apache-tomcat-8.5.45/bin/bootstrap.jar:/opt/apache-tomcat-8.5.45/bin/tomcat-juli.jar
Tomcat started. #启动成功