shell脚本编写笔记
本是最近在学习Elastic Search,但是每次启动一个集群环境的时候,需要执行繁琐的命令,于是补了下shell脚本,编写个简单的shell脚本用于一键启动我的集群环境,方便自己的学习。以下是在学习过程中的一些个人笔记。
最后一个章节是我实际编写可运行的脚本用于启动我的集群环境和kibana,仅供参考。
语法
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,脚本开头必须是 #! /bin/sh 或者**#! /bin/bash**
变量定义
普通变量
直接变量名等于即可。如num=10
,这就定义一个变量明为num,并赋值为10
交互变量
用于接收用户输入的变量read num
,这就定义了一个num变量用于接收用户输入的值
预设变量
类似于常用的tomcat启动指令./catalina start
,这里的catalina实际就是一个sh脚本,start就是预设参数,在脚本文件中直接用$0
、$1
、$2
来使用,这里$0
表示的是catalina脚本本身的名字,$1
、$2
则是跟在执行脚本后的参数
只读变量
num=10
readonly num
变量使用
变量的使用,只需要在变量的前面加上关键字**$**。变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。比方说在拼接字符串的时候,如下:
read num
echo "input num is ${num}."
循环
if-else
# if-lese
if [ -e $dataPath ]
then
echo "${dataPath}存在"
else
echo "${dataPath}不存在"
fi
if-else-if
# if-lese
if [ -e $dataPath ]
then
echo "${dataPath}存在"
elif [ -w $dataPath ]
echo "${dataPath}可以写"
fi
while
num=10
while(($num > 1))
do
echo $num
let "num--"
done
for循环
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
运算符
算数运算符
运算符 | 说明 | 备注 |
---|---|---|
+ | 加法 | |
- | 减法 | |
* | 惩罚 | |
/ | 除法 | |
% | 取余 | |
= | 赋值 | |
== | 相等 | |
!= | 不相等 |
关系运算符
运算符 | 说明 | 备注 |
---|---|---|
-eq | == | |
-ne | != | |
-gt | > | |
-lt | < | |
-ge | >= | |
-le | <= |
逻辑运算符
运算符 | 说明 | 备注 |
---|---|---|
! | 非 | |
-o | or | |
-a | and | |
&& | and | |
|| | or |
字符串运算符
运算符 | 说明 | 示例 (PS:注意中括号表达式内的空格) |
---|---|---|
-z | 判断字符串长度是否为0,为0返回true | [ -z $a ] |
-n | 检测字符串长度是否为0,为0返回 false。 | [ -n $a ] |
$ | 检测字符串是否为空,不为空返回 true。 | [ $a ] |
文件运算符
运算符 | 说明 | 示例 (PS:注意中括号表达式内的空格) |
---|---|---|
-b | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回true |
-c | 检测文件是否是字符设备文件,如果是,则返回 true。 | 略,用法同上 |
-d | 检测文件是否是目录,如果是,则返回 true。 | 略,用法同上 |
-f | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | 略,用法同上 |
-g | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | 略,用法同上 |
-k | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | 略,用法同上 |
-p | 检测文件是否是有名管道,如果是,则返回 true。 | 略,用法同上 |
-u | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | 略,用法同上 |
-r | 检测文件是否可读,如果是,则返回 true。 | 略,用法同上 |
-w | 检测文件是否可写,如果是,则返回 true。 | 略,用法同上 |
-x | 检测文件是否可执行,如果是,则返回 true。 | 略,用法同上 |
-s | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | 略,用法同上 |
-e | 检测文件(包括目录)是否存在,如果是,则返回 true。 | 略,用法同上 |
-S | 判断某文件是否 socket。 | 略,用法同上 |
-L | 检测文件是否存在并且是一个符号链接。 | 略,用法同上 |
实际脚本例子
#! /bin/bash
echo "请选择启动的集群数量:"
# readz关键字声明一个变量用于接收用户输入的参数
read num
# 进入到elastic search的工作目录
cd /apps/elasticsearch-7.6.0/bin
# 输出当前工作路径
pwd
#定义变量curr_node
curr_node=0
# while循环,循环启动集群
while(($curr_node < $num))
# while循环体开始关键字
do
# 定义三个变量
nodeName=node$[$curr_node+1]
dataPath=/apps/cluster_elasticsearch/$nodeName/data
logsPath=/apps/cluster_elasticsearch/$nodeName/logs
# 判断数据目录是否存在,不存在即创建
if [ ! -e $dataPath ]
then
echo "${dataPath}不存在"
mkdir -p $dataPath
echo "${dataPath}创建成功"
fi
if [ ! -e $logsPath ]
then
echo "${logsPath}不存在"
mkdir -p $logsPath
echo "${logsPath}创建成功"
fi
# 动态拼接启动脚本命令,依次执行启动命令
./elasticsearch -d -E node.name=node-$[$curr_node+1] -E http.port=$[9200+$curr_node] -E transport.port=$[9300+$curr_node] -E path.data=${dataPath} -E path.logs=${logsPath}
# 输出信息
echo "node-"$[$curr_node+1]"启动中..."
# 让变量自身+1
let "curr_node++"
# while循环体结束关键字
done
echo "Elastic Search ${num}个节点启动中"
echo "是否需要启动kibana:[请输入y/n]"
read kibana_flag
if [ $kibana_flag == "y" ]
then
cd /apps/kibana-7.6.0-linux-x86_64
pwd
nohup ./bin/kibana > logs/kibana.out &
echo "kibana启动中"
fi