文章目录
- 1,shell核心概念
- 1. 1,变量
- 1. 2. 引号
- 1. 3. 循环
- 1. 4. 条件判断
- 1. 5. 函数
- 1. 6. 重定向
- 1. 7. 管道
- 1. 8. 通配符
- 2,案例
本文通过介绍Linux Shell编程中最重要的十个核心概念,帮助初学者快速入门。
1,shell核心概念
1. 1,变量
变量是存储数据值的标识符。在Shell脚本中,变量分为环境变量、位置变量和用户自定义变量。
示例:
# 定义变量
my_variable="Hello, World!"
# 使用变量
echo $my_variable
1. 2. 引号
在Shell脚本中,引号用于定义字符串。单引号和双引号有不同的作用,单引号会忽略特殊字符,而双引号会保留特殊字符的原本含义。
示例:
# 单引号
echo 'Hello, $my_variable'
# 双引号
echo "Hello, $my_variable"
1. 3. 循环
循环用于重复执行一系列命令。常见的循环有for循环、while循环和until循环。
示例(for循环):
for i in {1..5};
do
echo "Loop $i"
done
1. 4. 条件判断
条件判断用于根据特定条件执行不同的操作。常见的条件判断有if语句、case语句等。
示例(if语句):
if [ $i -eq 1 ];
then
echo "i is equal to 1."
fi
1. 5. 函数
函数是一段可重复使用的代码块,可以提高代码的模块化程度。
示例:
my_function() {
echo "Hello, $1"
}
my_function "World"
1. 6. 重定向
重定向用于改变命令的输入输出方向,常见的重定向有标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)。
示例:
# 将输出重定向到文件
echo "Hello, World!" > output.txt
1. 7. 管道
管道用于将一个命令的输出作为另一个命令的输入。
示例:
# 查找当前目录下包含“txt”的文件,并统计数量
ls | grep txt | wc -l
1. 8. 通配符
通配符用于匹配文件名,常见的通配符有*(匹配任意字符)、?(匹配单个字符)等。
示例:
# 删除当前目录下所有.txt文件
rm *.txt
- Shell脚本执行权限
为Shell脚本设置执行权限,使其能够独立运行。
示例:
# 为脚本添加执行权限
chmod +x my_script.sh
# 运行脚本./my_script.sh
- 调试
在编写Shell脚本时,调试是必不可少的环节。使用set命令可以开启调试模式。
示例:
# 开启调试模式
set -x
# 执行命令
ls
2,案例
Linux一键批量启动、停止、重启Jar包Shell脚本
#!/bin/bash
#C机子启动停止5个vts微服务
#端口号,根据此端口号确定PID
export PORT1=8078
export PORT2=8079
export PORT3=8086
export PORT4=8088
export PORT5=8089
export PORT6=8091
export PORT7=8092
export PORT8=8093
export PORT9=8095
export PORT10=8099
#启动命令所在目录
export HOME='/home/project'
#jar包所在目录
export jt809_monitor8078=/home/project/jt809-monitor-0.0.1-SNAPSHOT.jar
export jt809_service8079=/home/project/jt809-service-0.0.1-SNAPSHOT.jar
export protocol_service8086=/home/project/protocol-service-1.0-SNAPSHOT.jar
export trans_service8088=/home/project/trans-service-1.0-SNAPSHOT.jar
export info_sys_service8089=/home/project/info-sys-service-1.0-SNAPSHOT.jar
export vts_consumer8091=/home/project/vts-consumer-0.0.1-SNAPSHOT.jar
export report_service8092=/home/project/report-service-1.0-SNAPSHOT.jar
export peripheral_data_protocol_service8093=/home/project/peripheral-data-protocol-service-1.0-SNAPSHOT.jar
export peripheral_data_business_service8095=/home/project/peripheral-data-business-service-1.0-SNAPSHOT.jar
export jt808_service8099=/home/project/jt808-service-1.0-SNAPSHOT.jar
#查询出监听了PORT端口TCP协议的程序
pid1=`ps -ef|grep $jt809_monitor8078|grep -v grep|awk '{print $2}' `
pid2=`ps -ef|grep $jt809_service8079|grep -v grep|awk '{print $2}' `
pid3=`ps -ef|grep $protocol_service8086|grep -v grep|awk '{print $2}' `
pid4=`ps -ef|grep $trans_service8088|grep -v grep|awk '{print $2}' `
pid5=`ps -ef|grep $info_sys_service8089|grep -v grep|awk '{print $2}' `
pid6=`ps -ef|grep $vts_consumer8091|grep -v grep|awk '{print $2}' `
pid7=`ps -ef|grep $report_service8092|grep -v grep|awk '{print $2}' `
pid8=`ps -ef|grep $peripheral_data_protocol_service8093|grep -v grep|awk '{print $2}' `
pid9=`ps -ef|grep $peripheral_data_business_service8095|grep -v grep|awk '{print $2}' `
pid10=`ps -ef|grep $jt808_service8099|grep -v grep|awk '{print $2}' `
start(){
if [ -n "$pid5" ]; then
echo "info_sys_service8089 already start,pid:$pid5"
return 0
fi
#进入命令所在目录
cd $HOME
nohup java -Dspring.datasource.workId=13 -Dspring.datasource.dataCenterId=13 -Dhsf.server.ip=192.168.1.93 -Dhsf.server.port=12299 -Dpandora.location=/home/tools/taobao-hsf.sar-2019-06-stable.jar -Dlog4j2.formatMsgNoLookups=true -Dhsf.http.port=12232 -Dpandora.qos.port=12233 -Djmenv.tbsite.net=127.0.0.1 -jar $HOME/info-sys-service-1.0-SNAPSHOT.jar --server.port=8089 > /dev/null 2>&1 &
#启动服务 日志输出
echo "info_sys_service8089 start at port:$PORT5"
if [ -n "$pid6" ]; then
echo "vts_consumer8091 already start,pid:$pid6"
return 0
fi
#进入命令所在目录
cd $HOME
nohup java -Dhsf.server.ip=192.168.1.93 -Dhsf.server.port=12205 -Dlog4j2.formatMsgNoLookups=true -Dpandora.location=/home/tools/taobao-hsf.sar-2019-06-stable.jar -jar $HOME/vts-consumer-0.0.1-SNAPSHOT.jar --server.port=8091 > /dev/null 2>&1 &
#启动聊天服务器 把日志输出到HOME目录的server.log文件中
echo "vts_consumer8091 start at port:$PORT6"
}
stop(){
if [ -z "$pid5" ]; then
echo "not find info_sys_service8089 on port:$PORT5"
return 0
fi
#结束程序,使用讯号2,如果不行可以尝试讯号9强制结束
kill -9 $pid5
rm -rf $pid5
echo "kill info_sys_service8089 use signal 2,pid:$pid5"
if [ -z "$pid6" ]; then
echo "not find vts_consumer8091 on port:$PORT6"
return 0
fi
#结束程序,使用讯号2,如果不行可以尝试讯号9强制结束
kill -9 $pid6
rm -rf $pid6
echo "kill vts_consumer8091 use signal 2,pid:$pid6"
}
status(){
if [ -z "$pid5" ]; then
echo "not find info_sys_service8089 on port:$PORT5"
else
echo "info_sys_service8089 is running,pid:$pid5"
fi
if [ -z "$pid6" ]; then
echo "not find vts_consumer8091 on port:$PORT6"
else
echo "vts_consumer8091 is running,pid:$pid6"
fi
}
case $1 in
start)
start
;;
stop)
;;
restart)
$0 stop
sleep 2
$0 start
;;
status)
status
;;
*)
echo "Usage: {start|stop|status}"
exit 0
esac
fileformat=unix
本文针对Linux初学者,详细介绍了Shell编程的十个核心概念,并通过具体示例帮助读者理解和掌握这些概念。希望本文能为Linux初学者在学习Shell编程的道路上提供有益的指导。
人生从来没有真正的绝境。只要一个人的心中还怀着一粒信念的种子,那么总有一天,他就能走出困境,让生命重新开花结果。