创建函数以返回BASH中的更新路径

时间:2016-05-19 14:44:16

标签: bash

我在bash中有一个函数来删除路径的前两个目录。这很好用。我想补充一下,添加新的起始路径的能力,我遇到了问题。以下是我到目前为止的情况:

function fp {
  echo $1 | cut -d'/' -f4-
}

如果我这样调用函数:

fp 'dir1/dir2/dir3/file'

返回'dir3 / file1'。我现在需要它返回'dir5 / dir6 / dir3 / file',如何在路径前追加其他目录?

更新:

该方法的最初目的是创建一个别名,如果已更改,则将更新的文件复制到git仓库中。以下是现在可以使用的完整代码:

# Update dotfiles if there are any changes                                                                                                                         
alias dotu='for file in $(diff -qr ./ ~/ | grep differ | cut -d " " -f; do eval $(fp "$file"); echo "$file"; done'                                                                                                                                                                                                              
function fp {                                                                                                                                                      
  printf "%s%s" "cp $1 ~/dotfiles/" $(echo $1 | cut -d'/' -f4-)                                                                                                    
}

不是那么擅长bash,这可能很丑,但它对我有用。

更新#2:

好的,这就是我最终得到的,让函数自己复制:

# Update dotfiles if there are any changes                                                                                                                         
alias dotu='for file in $(diff -qr ./ ~/ | grep differ | cut -d " " -f; do fp "$file"; echo "$file"; done'                                                                                                                                                                                                                         
function fp {                                                                                                                                                      
  cp $1 ~/dotfiles/${1#*/*/*/}                                                                                                                                     
}

更新#3:

再一次,希望现在好了。

# Update dotfiles if there are any changes                                                                                                                         
alias dotu='for file in $(diff -qr ./ ~/ | grep differ | cut -d " " -f; do fp "$file"; echo "$file"; done'                                                                                                                                                                                                                         
function fp {                                                                                                                                                      
  cp "$1" ~/dotfiles/"${1#*/*/*/}"                                                                                                                                     
}

4 个答案:

答案 0 :(得分:6)

您可以使用参数扩展:

function fp {
    echo "dir5/dir6/${1#*/*/}"
}

答案 1 :(得分:2)

您可以使用命令替换($(...)),然后将其作为参数发送到printf。还要记住变量替换的引用:echo "$1"

fp() {
  printf "dir5/dir6/%s\n" "$(printf "%s\n" "$1" | cut -d'/' -f4-)"
}

我将function fp {更改为POSIX函数定义fp() {

答案 2 :(得分:1)

function fp {
  printf "%s%s" "/dev5/dir6/" "$(echo "$1" | cut -d'/' -f4-)"
}

会这样做。你也可以这样做:

function fp {
  printf "%s%s" "$2" "$(echo "$1" | cut -d'/' -f4-)"
}

其中$2是要追加的路径:

调用函数

fp "dir1/dir2/dir3/file" "/dir5/dir6/"

答案 3 :(得分:0)

字符串连接可以像将不同部分放在一起一样简单。您已经生成的路径末尾可以放在子shell($(...)或以前的`...`)中,它本身可以包含在双引号字符串中,因此它将扩展为其输出:

function fp {
    echo "/dir5/dir6/$(echo "$1" | cut -d'/' -f4-)"
}

话虽这么说,Casimir的答案参数扩展会更有效率,基于printf的解决方案将使我更具可移植性(以及更具可读性)。