如何编写将参数识别为目录的bash脚本

时间:2017-02-26 20:31:54

标签: bash shell

我有这个bash脚本来缩短我的GitHub推送:

#!/bin/bash

cd /Users/matias/Documents/GitHub/$1
git add *
git commit -m "$2"
git push

我这样用:

matias$ path/to/script.sh project-name commit-message

问题在于我必须写出存储库的全名,它必须在/Users/matias/Documents/GitHub/

我想要的是知道$1是一个目录,所以当我打字时,点击标签会自动完成结果,比如使用nano或类似的东西。

1 个答案:

答案 0 :(得分:0)

您可以将bash completion与以下脚本push一起使用:

#!/bin/bash

_push()
{
    IFS=$'\n'

    prev="${COMP_WORDS[COMP_CWORD-1]}"

    tmp=( $(compgen -W "$(ls -d $REPO_PATH/*/ | awk -F/ '{ print$(NF-1) }')" -- "${COMP_WORDS[$COMP_CWORD]}" ))
    COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -o default -F _push ./push_git

您的脚本push_git就像:

#!/bin/bash

echo "repo is $1"
cd $REPO_PATH/$1
git add *
git commit -m "$2"
git push

进行测试:

export REPO_PATH=/Users/matias/Documents/GitHub
source push
./push_git #TAB

./push_git之后写入TAB时,将执行bash完成功能。从this post开始,您可以完成列出目标路径目录项的命令"$(ls -d $REPO_PATH/*/ | awk -F/ '{ print$(NF-1) }')"

如果您想要更完善的解决方案:

  • 将完成文件push复制到/etc/bash_completion.d/push
  • 将您的脚本复制到/bin/push_git
  • 使用/etc/bash_completion.d/push
  • 修改complete -o default -F _push push_git
  • 修改您的.bash_rc以包含export REPO_PATH=/Users/matias/Documents/GitHub