无法读取bash脚本中的第二个参数

时间:2018-10-16 04:38:53

标签: linux bash shell unix

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

进行提交时
./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

2 个答案:

答案 0 :(得分:1)

bash像这样处理参数:

./test.sh commit -m "first" 

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

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

答案 1 :(得分: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]