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
相关产品推荐
相关产品推荐

