You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bat/Cmd的stat类参数展开功能在Sh/Bash中的等价实现咨询

Bash 没有内置和批处理参数展开完全一致的语法,但可以通过内置参数扩展、read 命令和基础系统工具组合实现所有对应功能,常用场景的等价实现如下:

  • 去外层引号(对应 %~I):
    纯内置实现不需要调用外部命令:
    # 处理变量$1的外层引号
    temp="${1#\"}"
    temp="${temp%\"}"
    echo "$temp"
    
  • 获取绝对路径(对应 %~fI,也就是你最常用的 %~f1 功能):
    用 realpath 工具实现,-m 参数允许目标文件不存在时也输出拼接后的绝对路径,命令执行失败则返回原始参数:
    full_path=$(realpath -m "$1" 2>/dev/null || echo "$1")
    echo "$full_path"
    
    部分精简系统没有 realpath 可以替换为 readlink -f "$1",效果一致。
  • 获取文件所在目录(对应 %~dpI):
    # 取相对路径的目录
    dir=$(dirname "$1")
    # 取绝对路径的目录
    abs_dir=$(dirname "$(realpath -m "$1")")
    
  • 获取无后缀文件名(对应 %~nI):
    filename="${1##*/}"
    name_no_ext="${filename%.*}"
    echo "$name_no_ext"
    
  • 获取文件后缀(对应 %~xI):
    filename="${1##*/}"
    ext=$([[ "$filename" == *.* ]] && echo ".${filename##*.}" || echo "")
    echo "$ext"
    
  • 获取带后缀的文件名(对应 %~nxI):
    basename "$1"
    
  • 获取文件大小(对应 %~zI):
    # Linux 平台
    stat -c "%s" "$1" 2>/dev/null
    # macOS 平台
    stat -f "%z" "$1" 2>/dev/null
    
  • 在 PATH 环境变量中搜索目标文件的全路径(对应 %~$PATH:I):
    # 找不到则返回空,和批处理逻辑完全一致
    command -v "$1"
    
  • for /f "delims=... tokens=..." 等价实现:
    用 read 命令自定义分隔符拆分字段即可,示例为按逗号分隔取第1、3个字段:
    # IFS 变量配置分隔符,对应delims
    # 变量顺序对应tokens的取值顺序,_用于占位跳过不需要的字段
    while IFS=, read -r col1 _ col3 _; do
      echo "第1列:$col1,第3列:$col3"
    done < 目标文件.txt
    

如果需要频繁使用这些功能,可以把上述逻辑封装成自定义函数,调用起来和批处理的参数展开一样便捷。

内容的提问来源于stack exchange,提问作者Kochise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:15:01