【问题标题】:Trouble reading second argument in bash script无法读取 bash 脚本中的第二个参数
【发布时间】:2019-03-20 13:08:35
【问题描述】:

我需要为提交函数传递参数。当我通过

进行提交时
./test.sh commit -m "first" 

它并没有真正提交它。相信不知何故我没有在案例或函数中传递正确的参数参数。

这是脚本

#!/usr/bin/env bash

clone () {
  git clone $1
}

commit () {
  git commit $*
}

case $1
in
   clone) clone $2 ;;
   commit) commit $2 ;;

       *) echo "Invalid Argument passed" ;;
esac

【问题讨论】:

标签: linux bash shell unix


【解决方案1】:

为了安全地支持多个参数(包括带有特殊字符的参数),函数体应该是

git clone "$@"

和

git commit "$@"

.

出于同样的原因,case 代码应该是:

case $1 in
    clone)  clone "${@:2}" ;;
    commit) commit "${@:2}" ;;
    *)      echo "Invalid Argument passed" ;;
esac

在函数中,"$@" 扩展为所有函数参数,安全引用,因此它们不受分词或扩展的影响。

在case 语句中,${@:2} 在第一个参数之后扩展为命令行参数列表,安全引用。

欲了解更多信息,请参阅Handling positional parameters [Bash Hackers Wiki]。

【讨论】:

    【解决方案2】:

    bash 会这样处理参数:

    ./test.sh commit -m "first" 
    
    0: ./test.sh
    1: commit
    2: -m
    3: first
    

    所以你的"first" 实际上是参数$3。

    【讨论】:

    • 非常感谢大家..非常感谢您的帮助。所以我的代码看起来不错?但不知何故它还没有工作。奇怪的是,我必须运行两次 add 和 commit 才能使它工作,我相信我错过了一些东西。 commit () { git commit $1 $2 } case $1 in clone) clone $2 ;;提交) 提交 $2 $3 ;; *) echo "无效参数通过" ;; esac
    • 您好,我只是在回答参数问题。至于 git 本身,我对 git 的了解还不够,无法给出明确的答案。
    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 2020-06-27
    • 1970-01-01
    • 2017-06-09
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    相关资源
    最近更新 更多