前言
最近和服务器频繁打交道,Shell 脚本写的也比较多,记录一波使用。
Shell 介绍
它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。使用它可以更好的在linux上工作,提高效率,可以编写脚本,节省时间。例如在 Linux 写好脚本程序,然后使用 sh 命令 sh xxx``_.sh_
执行就可以了,非常简单。
Shell 有很多种格式,但一般 Shell 脚本是以 #!/bin/bash
开头(这个非必须,但有时不加会报错)例如在 Unix 环境下,新建 hello.sh
#!/bin/bash
# echo 是个关键字,用于输出
echo 'Hello World!'
保存然后执行 sh hello.sh
然后在命令行中可以看到 Hello World! 这就是一个简单的 Shell 脚本了。
变量声明
定义变量没有特殊的指令来标记,只需注意变量名的规范性即可,获取变量只需在该变量前面加‘$’符合即可。例如:
#!/bin/bash
msg='Hello World!'
# 或者 echo ${msg}
echo $msg
变量类型
Shell 中有三种变量类型:
- 环境变量,所有的 Shell 都共享,例如 $JAVA_HOME
- Shell 变量,所有 Shell 共享
- 局部变量,只在该 Shell 文件中共享
常见操作
脚本中执行命令
脚本中执行命令,需要用反引号“``”引起来
# 查询SQL
r1 = `mysql -uroot -proot -e "select * from user where id = 1"`
echo $1
# 获取当前目录所有文件
r2 = `ll`
echo $r2
字符串
m1='abc'
m2='def'
# 拼接,输出结果为:abcdef
echo $m1$m2
# 获取长度,输出结果为:3
echo ${#m1}
脚本传参
向文件传递参数,在文件中用 $n 接收,第一个参数就是 $1,第二个就是 $2….,注意的是第一个参数默认就是文件名,$* 显示所有参数,例如:
#这里传了4个参数,分别是 demo.sh 1 2 3
sh demo.sh 1 2 3
条件判断
Shell 中 if 的格式为:
# 最后是if的倒写fi结尾表示结束,注意空格
if [ condition ]
then
command1
elif [ condition ]
then
command2
else
command3
fi
# 例如:sh if.sh eat 脚本,那么会输出 eat ...
if [ $1 = 'eat' ]
then
echo 'eat ...'
elif [ $1 = 666 ]
then
echo 'i say 666'
else
echo 'nothing...'
fi
for 循环
for 循环有时直接在命令行就会用到
# 格式
for var in item1 item2 ... itemN;
do
command1
done
# 例如: sh for.sh 会把该路径下的所有文件都打印出来
#!/bin/bash
for i in `ls`;
do
echo $i
done
# 也可以直接在命令行中运行
for i in `ls`; echo $i
案例
重启 Java 应用
#!/bin/bash
echo '-------------------------ready operating----------------'
# ps -ef 找到进程
# grep 过滤指定应用名称
# awk 按行处理,默认按空格分隔,$2 指定的是取第2个
pid=`jps -v | grep "backend-app"| awk '{print $2}'`
echo '----------------------------------------pid='$pid
# 如果有该进程就kill掉,-n 表示该字符长度不为0
[ -n $pid ] && kill -9 $pid
nohup java -jar backend-app-v1.0.jar >/home/backend-log.txt &
# 睡眠5s
sleep 5
jps
echo '-------------------------ok!---------'
上传指定名称的文件到服务器
#!/bin/bash
echo "请输入文件名:"
# 获取控制台输入的变量
read file
scp "$file" root@192.168.9.3:/home
复杂脚本
如果一个脚本比较复杂,会封装成函数的形式调用
#!/bin/bash
startApp()
{
echo 'start app ...'
}
stopApp()
{
echo 'stop app ...'
}
restartApp()
{
echo 'restart app ..'
}
# 符合条件才调用相应的函数
if [ $1 = 'start' ]
then
startApp
elif [ $1 = 'stop' ]
then
stopApp
elif [ $1 = 'restart' ]
then
restartApp
else
echo 'nothing'
fi
统计频率进行排序
cat test_redis.log
# awk 分割
| awk -F 'Dec' '{print $2}'
| awk '{print $1}'
| awk -F ':' '{print $1}'
# 在每列的左边显示出现次数
| uniq -c
# 排序,-r 是倒序
| sort -r