Java 部署脚本
Java Sprintboot jar 项目启动、停止脚本:https://www.cnblogs.com/vipsoft/p/15952112.html
SpringBoot 不同的环境,打不同的包名: https://www.cnblogs.com/vipsoft/p/18577679
deploy.sh说明
- if [[ ! "$NEW_JAR_NAME" =~ \.jar$ ]]; then
- print_error "文件名必须以 .jar 结尾: ${NEW_JAR_NAME}"
- exit 1
- fi
- # =~ 是bash的正则匹配操作符
- # \.jar 中的 \. 表示匹配实际的点号(正则中点是特殊字符)
- # $ 表示字符串结尾
- # 双中括号 [[ ]] 支持正则匹配,单中括号 [ ] 不支持
复制代码 为什么有时候 $后面加 {} 有时候不加
这是Shell中变量引用的不同方式,主要区别在于明确变量边界和使用数组
1. 基本规则:什么时候需要 {}
需要 {} 的情况:
- # 1. 变量名后面紧跟其他字符(没有空格分隔)
- name="world"
- echo "Hello, ${name}!" # ✅ 正确: Hello, world!
- echo "Hello, $name!" # ⚠️ 有风险: 会被解释为 $name! 变量
- # 2. 数组元素访问
- files=("a.txt" "b.txt")
- echo "${files[0]}" # ✅ 正确: a.txt
- echo "$files[0]" # ❌ 错误: 只会输出 a.txt[0]
- # 3. 特殊参数扩展
- echo "${#name}" # ✅ 输出字符串长度: 5
- echo "$#name" # ❌ 错误: 输出参数个数+name
- # 4. 变量默认值
- echo "${JAR_NAME:-default.jar}" # ✅ 如果JAR_NAME为空,使用默认值
复制代码 不需要 {} 的情况:
- # 1. 变量名后面是空格或换行
- name="world"
- echo "Hello, $name" # ✅ 正确: Hello, world
- # 2. 变量名后面是特殊字符(会被shell识别为终止)
- echo "Value: $name." # ✅ 正确: Value: world.
- echo "File: $name.txt" # ✅ 正确(但如果有变量$nametxt会出错)
- # 3. 简单变量引用
- JAR_NAME="app.jar"
- echo "检测到的Jar包: $JAR_NAME" # ✅ 正确
复制代码 2. 数组的特殊性
这是你问题中的关键区别:- # 数组变量必须使用 ${}
- missing=("java" "git" "mvn")
- # ✅ 正确:使用 ${missing[*]} 或 ${missing[@]}
- echo "缺少命令: ${missing[*]}" # 输出: 缺少命令: java git mvn
- echo "缺少命令: ${missing[@]}" # 同上(但在循环中有区别)
- # ❌ 错误:不加 {} 会被当成普通变量
- echo "缺少命令: $missing[*]" # 输出: 缺少命令: java[*]
- echo "缺少命令: $missing[@]" # 输出: 缺少命令: java[@]
复制代码 3. 具体对比分析
你的例子1:数组必须用 ${}
- missing=("java" "git")
- # 正确示例
- echo "缺少命令: ${missing[*]}" # ✅ 输出: 缺少命令: java git
- echo "缺少命令: ${missing[@]}" # ✅ 输出: 缺少命令: java git
- # 错误示例
- echo "缺少命令: $missing[*]" # ❌ 输出: 缺少命令: java[*]
- echo "缺少命令: $missing" # ❌ 输出: 缺少命令: java(只显示第一个元素)
复制代码 你的例子2:普通变量可以不用 {}
- JAR_NAME="app-1.27.jar"
- # 都可以,但第一种更安全
- echo "检测到的Jar包: ${JAR_NAME}" # ✅ 推荐
- echo "检测到的Jar包: $JAR_NAME" # ✅ 可接受
复制代码 4. 完整示例展示区别
- #!/bin/bash
- # 场景1:普通变量
- APP_NAME="myapp"
- VERSION="1.27"
- # 正确但可能有问题
- echo "应用: $APP_NAME$VERSION" # ✅ 输出: myapp1.27
- echo "应用: ${APP_NAME}${VERSION}" # ✅ 输出: myapp1.27(更明确)
- # 有问题的情况
- echo "应用: $APP_NAME_$VERSION" # ❌ 尝试访问 $APP_NAME_ 变量
- echo "应用: ${APP_NAME}_$VERSION" # ✅ 正确: myapp_1.27
- # 场景2:数组变量
- commands=("start" "stop" "restart")
- echo "命令: ${commands[*]}" # ✅ 正确: start stop restart
- echo "命令: $commands[*]" # ❌ 错误: start[*]
- echo "命令: $commands" # ❌ 错误: start(只取第一个)
- # 场景3:带特殊字符
- file="data"
- echo "文件: $file.txt" # ⚠️ 可能出错:如果存在 $filetxt 变量
- echo "文件: ${file}.txt" # ✅ 安全: data.txt
复制代码 5. 最佳实践建议
总是使用 {}(推荐)
- # 始终使用 ${},这样最安全
- echo "${variable}"
- echo "${array[@]}"
- echo "${JAR_NAME}"
复制代码 安全引用表格
场景推荐写法风险写法说明普通变量${VAR} | $VAR加{}总是安全的变量拼接${VAR}text | $VARtext避免歧义数组所有元素${ARRAY[@]} | $ARRAY普通引用只取第一个数组特定元素${ARRAY[0]} | $ARRAY[0]必须加{}带特殊字符${VAR}_suffix | $VAR_suffix避免错误解析6. 高级用法:变量扩展
{} 还能实现强大的变量扩展功能:- # 1. 默认值
- echo "${NAME:-无名氏}" # 如果NAME为空,显示"无名氏"
- echo "$NAME" # 如果NAME为空,显示空
- # 2. 变量长度
- name="hello"
- echo "长度: ${#name}" # 输出: 5
- echo "长度: $#name" # 错误: 输出参数个数
- # 3. 字符串切片
- str="abcdefg"
- echo "${str:0:3}" # 输出: abc(从0开始取3个)
- echo "${str: -3}" # 输出: efg(最后3个)
- # 4. 模式替换
- path="/home/user/file.txt"
- echo "${path/file/doc}" # 输出: /home/user/doc.txt
- echo "${path//\// }" # 输出: home user file.txt(替换所有/)
复制代码 7. 你的具体问题解答
- # 你的代码中:
- echo "缺少命令: ${missing[*]}" # ✅ 必须加{},因为missing是数组
- echo "检测到的Jar包: $JAR_NAME" # ✅ 可以不加,但加了更安全
- # 更好的写法(总是加{}):
- echo "缺少命令: ${missing[*]}" # 明确表示是数组
- echo "检测到的Jar包: ${JAR_NAME}" # 安全,避免后续修改带来的问题
复制代码 总结
- 数组变量必须用 ${}:${array[@]} 或 ${array
- }
- 普通变量建议用 ${}:更安全,更明确
- 变量名边界模糊时用 ${}:${var}_suffix
- 使用高级功能时用 ${}:默认值、字符串操作等
黄金规则:当有疑问时,总是使用 ${},这样永远不会出错。多两个字符能避免很多难以调试的问题。
在Shell脚本中,return 1 和 exit 1 有重要的区别:
核心区别
特性return 1exit 1作用范围函数内部整个脚本执行后返回调用处继续执行立即终止脚本可捕获会被函数调用者接收整个进程退出退出状态设置 $? 为1脚本以状态码1退出详细解释
1. return 1 - 函数返回值
- #!/bin/bash
- test_return() {
- echo "函数开始"
- if [ $1 -eq 0 ]; then
- return 0 # 成功
- else
- return 1 # 失败
- fi
- }
- test_return 0
- echo "返回值: $?" # 输出: 0
- test_return 1
- echo "返回值: $?" # 输出: 1
- echo "脚本继续执行..." # 这行会执行
复制代码 2. exit 1 - 退出脚本
- #!/bin/bash
- test_exit() {
- echo "函数开始"
- if [ $1 -eq 0 ]; then
- return 0
- else
- echo "发生错误,退出脚本"
- exit 1 # 整个脚本立即终止!
- fi
- }
- test_exit 0
- echo "这行会执行" # 会执行
- test_exit 1
- echo "这行永远不会执行" # 不会执行
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |