惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
Google DeepMind News
Google DeepMind News
G
Google Developers Blog
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
月光博客
月光博客
Jina AI
Jina AI
宝玉的分享
宝玉的分享
人人都是产品经理
人人都是产品经理
D
DataBreaches.Net
V
V2EX
WordPress大学
WordPress大学
T
The Blog of Author Tim Ferriss
Last Week in AI
Last Week in AI
B
Blog
博客园 - 叶小钗
小众软件
小众软件
Stack Overflow Blog
Stack Overflow Blog
P
Proofpoint News Feed
A
About on SuperTechFans
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Y
Y Combinator Blog
Microsoft Security Blog
Microsoft Security Blog

博客园 - 有点懒惰的大青年

Python格式化字符串 Python中的浅拷贝和深拷贝 CompletableFuture.runAsync来进行异步任务和ThreadPoolExecutor来执行有什么区别? 用一个实际业务场景演示ON和WHERE的正确使用方式 idea中查看源码 异或运算 使用Hutool对时间的花式操作 合并K个升序列表 比较器 枚举类的设计模式 spring boot中使用RedissonClient实现分布式锁 idea同时启动application,启用不同端口 @PostConstruct用法 ApplicationContext 事件发布与监听机制详解 java自带命令jps介绍 关于maven中标签的说明 mysql的跨库查询 linux命令ll显示结果的含义 Files类的使用 java环境变量设置 java值传递和引用传递 kafka的集群与可靠性 kafka的消费全流程 关于kafka 达梦数据库执行计划介绍 关于MQ 用位运算实现加减乘除(3)
shell脚本变量记录
有点懒惰的大青年 · 2026-09-04 · via 博客园 - 有点懒惰的大青年

1.$0          

表示当前脚本本身的路径(包含文件名),示例:如果脚本在 /home/user/projects/bin/start.sh,那么 $0 就是 /home/user/projects/bin/start.sh

2.dirname $0  

dirname 命令用于提取路径的目录部分(去掉文件名)

dirname /home/user/projects/bin/start.sh   # 输出 /home/user/projects/bin
dirname ./bin/start.sh                     # 输出 ./bin

3.SCRIPTNAME=$(basename $0)

SCRIPTNAME=	            定义一个变量,名为 SCRIPTNAME
$(...)                  命令替换,先执行括号内的命令,将输出结果赋值给变量
basename                一个 Linux 命令,用于去除路径中的目录部分,只保留最后的文件名
$0                      Shell 特殊变量,表示当前脚本的完整路径和名称(启动脚本时传入的第一个参数)

示例脚本:

#!/bin/bash

# 获取脚本名称
SCRIPTNAME=$(basename $0)

# 获取脚本所在目录的父级目录
BASEDIR=$(cd $(dirname $0)/..; pwd -P)

# 检查配置文件是否存在
CONFIG_FILE="$BASEDIR/config/application.yml"
if [ ! -f "$CONFIG_FILE" ]; then
    echo "[$SCRIPTNAME] 错误:配置文件不存在 $CONFIG_FILE"
    exit 1
fi

# 记录启动日志
echo "[$SCRIPTNAME] 启动时间: $(date)"
echo "[$SCRIPTNAME] 项目目录: $BASEDIR"

# 启动应用
echo "[$SCRIPTNAME] 正在启动服务..."

执行结果(假设脚本名为 start.sh):

假设你的脚本文件位于 /home/user/projects/bin/start.sh

[start.sh] 启动时间: Thu Sep  4 10:00:00 CST 2026
[start.sh] 项目目录: /home/user/myproject
[start.sh] 正在启动服务...

在实际脚本中,basename 和 dirname 通常配合使用:

# 获取脚本所在的目录
SCRIPT_DIR=$(dirname $0)           # 例如:/home/user/projects/bin

# 获取脚本名称
SCRIPT_NAME=$(basename $0)         # 例如:start.sh

# 获取项目根目录(父级目录)
BASEDIR=$(cd $SCRIPT_DIR/..; pwd -P)

4.if [[ -f ${BASEDIR}/bin/run.conf ]]; then

整体含义: 如果 ${BASEDIR}/bin/run.conf 这个普通文件存在,则执行 then 分支的代码。

[[ ... ]]                    Bash 的增强测试结构(比 [ ... ] 更强大,支持更多操作符)
-f                           文件测试运算符,检查是否为"普通文件"(regular file)且存在
${BASEDIR}/bin/run.conf      被测试的文件路径,BASEDIR 是之前定义的变量

-z                           检查字符串是否为空
VAR="hello"
[[ -z "$VAR" ]]           # false

# 检查用户是否输入了参数
if [[ -z "$1" ]]; then
    echo "错误:缺少参数!"
    echo "用法: $0 <文件名>"
    exit 1
fi

# 检查配置文件路径是否为空
if [[ -z "$CONFIG_FILE" ]]; then
    CONFIG_FILE="/etc/default/app.conf"
fi

--