我需要为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
答案 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]。