shell脚本变量记录

1.$0          

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

在 Shell 脚本/函数中,参数列表是从 $1 开始的,$0 是特殊的,它不属于参数列表。

$0 vs $1 的核心区别

变量 含义 示例值 归属
$0 脚本/函数本身的名称(或路径) ./deploy.sh 或 deploy 永远不是参数
$1 第一个传入的参数 v2.0.0 参数列表的第 1 个
$2 第二个传入的参数 prod 参数列表的第 2 个
$3 第三个传入的参数 依此类推 参数列表的第 3 个
$@ 所有参数(用空格分隔) v2.0.0 prod 所有参数的集合
$# 参数的个数 2 参数总数

在任何 Shell 脚本或函数中,参数列表永远是从 $1 开始计数的,$0 是保留给"当前脚本/函数名称"的特殊变量。

  • $0 不属于参数列表,它不会被 $# 计入总个数。
  • $1 是第一个参数$2 是第二个参数,依此类推。

 

示例 1:脚本(文件名为 test.sh

#!/bin/bash
echo "\$0 = $0"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "参数总数 = $#"

执行命令:

./test.sh v2.0.0 prod

输出结果:

$0 = ./test.sh          # 脚本名称(不是参数!)
$1 = v2.0.0             # 第一个参数
$2 = prod               # 第二个参数
$3 =                    # 没有第三个参数,为空
参数总数 = 2             # 只有 2 个参数($1 和 $2)

 

 

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                           检查字符串是否为空    -z:zero length → 空则真
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

-n                            测试运算符:字符串长度 > 0 时返回真(true)    -n:not empty → 非空则真
-n 和 -z 刚好相反,是一对互补的运算符。

deploy "v2.0.0"    # 调用函数时传入了参数 "v2.0.0"
if [ -n "$1" ]; then
    echo "参数不为空,值为:$1"   # ✅ 会执行这行
else
    echo "参数为空"
fi
# 输出:参数不为空,值为:v2.0.0

相关文件测试运算符(补充)

运算符 含义
-d 检查是否为目录
-e 检查是否存在(文件或目录)
-L 检查是否为软链接
-r 检查是否可读
-w 检查是否可写
-x 检查是否可执行
-s 检查文件是否存在且大小大于 0
-nt 文件1比文件2新(newer than)
-ot 文件1比文件2旧(older than)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

--

 

posted on 2026-09-04 18:01  有点懒惰的大青年  阅读(6)  评论(0)    收藏  举报