Shell脚本波浪号避坑指南

在 Shell 脚本中,~(波浪号)的解析规则需要注意:双引号包裹时,~ 不会被自动解析为用户家目录 ,直接写 BASE_DIR="~/apps" 会导致路径变成字面量的 ~/apps 而非实际的家目录路径(比如 /home/xxx/apps)。

以下是 正确定义并切换到用户家目录下 apps 目录 的几种方法,按推荐优先级排序:

方法 1:用 $HOME 环境变量(最推荐)

$HOME 是 Shell 内置的环境变量,直接指向当前用户的家目录,不受引号解析规则影响,兼容性最好:

bash 复制代码
#!/bin/bash

# 定义家目录下的 apps 路径(兼容所有 Shell 场景)
BASE_DIR="$HOME/apps"

# 切换到该目录(推荐加容错:目录不存在则创建)
cd "$BASE_DIR" || {
    echo "目录 $BASE_DIR 不存在,正在创建..."
    mkdir -p "$BASE_DIR"
    cd "$BASE_DIR" || exit 1  # 仍失败则退出脚本
}

# 验证当前目录
echo "当前目录:$(pwd)"

方法 2:先解析~再赋值(适合习惯用~的场景)

如果非要用 ~,需要让 Shell 先解析它(不包裹在双引号里),再赋值:

bash 复制代码
#!/bin/bash

# 注意:~ 不在双引号内,先被解析为家目录,再拼接 apps
BASE_DIR=~/"apps"

# 切换目录(同上,加容错)
cd "$BASE_DIR" || { mkdir -p "$BASE_DIR" && cd "$BASE_DIR"; }

echo "当前目录:$(pwd)"

方法 3:用 eval 强制解析(不推荐,仅作了解)

eval 可以强制解析字符串中的 ~,但存在安全风险(若路径含特殊字符可能被注入),仅适合特殊场景:

bash 复制代码
#!/bin/bash

# 先定义字面量路径,再用 eval 解析 ~
BASE_DIR="~/apps"
eval BASE_DIR="$BASE_DIR"  # 解析后 BASE_DIR 变为 /home/xxx/apps

# 切换目录
cd "$BASE_DIR" || exit 1
echo "当前目录:$(pwd)"

关键注意事项

  1. 引号规则 :
    • 单 / 双引号内的 ~ 会被当作普通字符,不会解析为家目录;
    • 无引号 / 仅部分包裹时(如 ~/"apps"),~ 会被正常解析。
  2. 容错处理 :cd 命令后加 || 处理目录不存在的情况,避免脚本报错中断;
  3. 跨用户兼容 :$HOME 会自动适配当前执行脚本的用户(比如 root 用户的 $HOME 是 /root),无需硬编码路径。

测试验证

执行脚本后,若输出类似 当前目录:/home/你的用户名/apps(或 /root/apps,若以 root 执行),则说明路径定义和切换成功。

相关推荐
奶茶树2 分钟前
【Linux】环境开发工具(vim,gcc,g++,Makefile)
linux·运维·vim
木子欢儿4 小时前
国内 macOS/Linux 安装 rust
linux·运维·服务器·macos·rust
say_fall4 小时前
【Linux网络编程】计算机网络基础:局域网与广域网、OSI七层模型与TCP/IP五层模型、封装解包与MAC/IP地址、端口号与socket编程接口
linux·网络·tcp/ip·计算机网络·信息与通信
进击的荆棘4 小时前
Linux系统——线程同步与互斥
linux·运维·服务器·策略模式·同步·互斥·posix
橙橙笔记4 小时前
QT的学习第四部分
linux·qt·学习·音视频
.道阻且长.4 小时前
Linux基本开发工具:gdb和cgdb的使用
linux·运维·服务器·开发语言
叼烟扛炮5 小时前
Linux 学习笔记(五十四):内网穿透实战——用 frp 让外网访问你的私人电脑
linux·服务器·网络·笔记·学习
Android系统攻城狮5 小时前
Linux FFmpeg深度解析之av_guess_format调用流程与实战(三十六)
linux·运维·服务器·ffmpeg·ffmpeg音视频进阶
进击的荆棘5 小时前
Linux系统——线程概念与控制之线程封装
linux·运维·服务器·线程
叼烟扛炮5 小时前
[LangChain] 学习笔记(05):提示词模板(Prompt)与少样本注入(Few-Shot)实战
linux·人工智能·笔记·学习·langchain·prompt