我需要在 bash 脚本中使用简洁且可读的函数,该函数将作为输入:
- 绝对路径(例如 /home/user/tmp/data/sample1.txt )
- 新文件名(例如extend_sample.dat)
并返回
具有新文件名的绝对路径(例如 /home/user/tmp/data/extended_sample.dat )
先感谢您!
答案1
有 2+1(额外)命令可以让处理路径名变得轻松:
- basename - 从文件名中删除目录和后缀
dirname - 从文件名中删除最后一个部分
readlink - 打印解析的符号链接或规范文件名
所以回答你的问题:
old_path=/home/user/tmp/data/sample1.txt
new_file=extended_sample.dat
new_path="$(dirname $old_path)/$new_file"
或者更改原始文件的路径名:
alt_path=/mnt/newroot/foo
new_path="$alt_path/$(basename $old_path)"
提取正在运行的脚本的完整位置(如果脚本是在其自己的文件中执行的,则有效):
dirname $(readlink -f ${0})
使用这 3 个命令,您可以轻松完成大部分路径操作。
答案2
注意,return
语句中巴什函数用于返回数值作为状态代码。
在最简单的情况下它看起来如何:
#!/bin/bash
path="/home/user/tmp/data/sample1.txt"
new_name="extended_sample.dat"
function get_new_path() { echo "${1%/*}/$2"; }
new_path=$(get_new_path "$path" "$new_name")
echo "$new_path"
上面将输出:
/home/user/tmp/data/extended_sample.dat
答案3
只是玩弄bash
namerefs:
path_replace_file () {
local -n pathvar="$1"
pathvar="${pathvar%/*}/$2"
}
pathname="/home/user/tmp/data/sample1.txt"
printf 'pathname before = %s\n' "$pathname"
path_replace_file pathname extended_sample.dat
printf 'pathname after = %s\n' "$pathname"
输出:
pathname before = /home/user/tmp/data/sample1.txt
pathname after = /home/user/tmp/data/extended_sample.dat
该path_replace_file
函数需要一个变量名作为它的第一个参数。在函数中,pathvar
其作用类似于该变量的别名(名称引用)。
该函数将 值的文件名部分替换$pathval
为函数第二个参数给出的值。
这需要bash
4.3 或更高版本。
更改local -n
为typeset -n
也会使其正常工作ksh93
。