首页 > 解决方案 > 在 shell 中,有没有办法创建一个 if 语句来查找除任何内容之外的任何内容,以及如何解析参数?

问题描述

我正在尝试编写一个自动化 git 推送过程的 shell 脚本;添加、提交和推送。完整的代码在这里。我希望它能够工作,所以当我通过参数时-f,我可以跟随我的提交消息。这是我到目前为止所拥有的:

fast() {
    git add -A
    echo ":: All changes tracked and staged."
    if [ "$2" = "" ]
    then 
        read -p "› Enter commit message: " commit
        echo
        echo "⇓ GIT OUTPUT ⇓"
        git commit -m "$commit"
        echo
    else
        echo "⇓ GIT OUTPUT ⇓"
        git commit -m "$*"
        echo
    fi 
    echo ":: Pushing to remote master."
    echo
    echo "⇓ GIT OUTPUT ⇓"
    git push -u origin master
    echo
    echo "Thanks for using pushall! Exiting..."
    exit
}

我目前遇到的问题是该if语句没有按预期工作。无论我在 之后放什么-f,它总是要求我输入提交信息。我试图做到这一点,所以如果我只是跑pushall -f它会询问消息,但如果我跑了pushall -f foo,它会提交消息“foo”,而不是询问。

另外,在我让if语句生效后,我如何才能让消息只有 3 美元及以上,而不是 0 美元、1 美元和 2 美元?我把 $* 作为一个占位符,但我不知道我将如何实际实现它。任何帮助表示赞赏,谢谢。

标签: gitshellif-statementunix

解决方案


shell 函数中的 shell 参数是*该函数*的参数,不是调用者的参数,而是它提供的参数。你有

if [ "$1" = "-f" ] || [ "$1" = "--fast" ]
then
    fast

所以你的fast调用根本不提供任何参数。

它已经失宠了,因为它具有老式 git-r-dun 的味道,但我认为选项处理最好使用getoptsand来完成case

while getopts f:-: opt; do case $opt in
f) message="$OPTARG" ;;
-) case $OPTARG in 
   fast) message="${!OPTIND}"; ((++OPTIND));;
   esac ;;
esac; done; shift $((OPTIND-1))

推荐阅读