详解Shell脚本~(波浪号)避坑指南

Written by

in

文章目录
  • $HOME 是 Shell 内置的环境变量,直接指向当前用户的家目录,不受引号解析规则影响,兼容性最好: #!/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)”
  • 如果非要用 ~,需要让 Shell 先解析它(不包裹在双引号里),再赋值: #!/bin/bash # 注意:~ 不在双引号内,先被解析为家目录,再拼接 apps BASE_DIR=~/”apps” # 切换目录(同上,加容错) cd “$BASE_DIR” || { mkdir -p “$BASE_DIR” && cd “$BASE_DIR”; } echo “当前目录:$(pwd)”
  • eval 可以强制解析字符串中的 ~,但存在安全风险(若路径含特殊字符可能被注入),仅适合特殊场景: #!/bin/bash # 先定义字面量路径,再用 eval 解析 ~ BASE_DIR=”~/apps” eval BASE_DIR=”$BASE_DIR” # 解析后 BASE_DIR 变为 /home/xxx/apps # 切换目录 cd “$BASE_DIR” || exit 1 echo “当前目录:$(pwd)”
  • 引号规则: 单 / 双引号内的 ~ 会被当作普通字符,不会解析为家目录; 无引号 / 仅部分包裹时(如 ~/"apps"),~ 会被正常解析。 容错处理:cd 命令后加 || 处理目录不存在的情况,避免脚本报错中断; 跨用户兼容:$HOME 会自动适配当前执行脚本的用户(比如 root 用户的 $HOME 是 /root),无需硬编码路径。
  • 执行脚本后,若输出类似 当前目录:/home/你的用户名/apps(或 /root/apps,若以 root 执行),则说明路径定义和切换成功。 到此这篇关于详解Shell脚本波浪号~避坑指南的文章就介绍到这了,更多相关Shell 波浪号内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: shell脚本中一些特殊符号 shell脚本中常见的一些特殊符号和作用详解 Shell脚本中$符号的几种用法小结 shell查找符号链接及其指向目标的方法介绍 详解Shell 脚本中 “$” 符号的多种用法 shell脚本中$符号的命令使用汇总 浅析shell脚本知识之符号篇 Shell脚本中$符号的嵌套使用方法小结
  • 目录
    • 方法 1:用$HOME环境变量(最推荐)
    • 方法 2:先解析~再赋值(适合习惯用~的场景)
    • 方法 3:用 eval 强制解析(不推荐,仅作了解)
    • 关键注意事项
    • 测试验证

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

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

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

    #!/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)"
    

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

    #!/bin/bash
    
    # 注意:~ 不在双引号内,先被解析为家目录,再拼接 apps
    BASE_DIR=~/"apps"
    
    # 切换目录(同上,加容错)
    cd "$BASE_DIR" || { mkdir -p "$BASE_DIR" && cd "$BASE_DIR"; }
    
    echo "当前目录:$(pwd)"
    

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

    #!/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 执行),则说明路径定义和切换成功。

    到此这篇关于详解Shell脚本波浪号~避坑指南的文章就介绍到这了,更多相关Shell 波浪号内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • shell脚本中一些特殊符号
    • shell脚本中常见的一些特殊符号和作用详解
    • Shell脚本中$符号的几种用法小结
    • shell查找符号链接及其指向目标的方法介绍
    • 详解Shell 脚本中 “$” 符号的多种用法
    • shell脚本中$符号的命令使用汇总
    • 浅析shell脚本知识之符号篇
    • Shell脚本中$符号的嵌套使用方法小结

    站内搜索