Shell脚本>双引号参数,仅在它存在的情况下

时间:2017-02-15 07:13:02

标签: git bash shell

后台:我们目前有一个项目,需要将多个git存储库克隆到单个父文件夹中。我尝试编写脚本,以便在所有子目录中运行git操作,以便更轻松地管理(例如./gitall.sh status / add / {{1 } / reset / commit -m "Foobar" / etc。

该脚本适用于所有操作,直到我尝试执行push

我收到每个目录的错误./gitall.sh push,因为有效命令是fatal: remote part of refspec is not a valid name ingit -C somedir push "" "" "" "" borks尾随双引号)。 N.B。参数需要双引号,以便用空格捕获参数。

gitall.sh

git

是否有双引号参数,只有它存在? (或者无论如何告诉find ./repo-* -type d -depth 0 -exec bash -c "git -C {} \"$1\" \"$2\" \"$3\" \"$4\" \"$5\"" \; 忽略尾随的双引号?)

3 个答案:

答案 0 :(得分:3)

在bash中传递未知数量参数的正确方法是使用"$@"。此外,您不需要显式调用bash,因为它会使您引用参数的方式变得复杂。

这会自动引用所有参数:

#!/bin/bash
find ./repo-* -type d -depth 0 -exec git -C {} "$@" ';'

再多一步,如果您想要的只是当前级别的目录条目,则无需调用find。匹配模式末尾的/将仅选择目录:

#!/bin/bash
for d in repo-*/; do
    [ -d "$d" ] && git -C "$d" "$@"
done

(注意,如果你没有任何匹配模式的目录,循环将使用文字参数repo-*/执行一次; [ -d "$d" ]将防止git被调用这种情况)。

最后,您可能需要考虑使用Google's repo tool而不是自己的解决方案来管理多个git repos。它非常强大且易于使用。

答案 1 :(得分:2)

问题是你要向git push传递额外的参数。每个""由shell传递给git,后者认为它获得7个参数,但最后4个是空字符串。

您正在寻找的是"$@""$@"相当于"$1" "$2" ...

不需要所有额外的引用,也不需要bash -c。 {shell}将扩展"$@"

另请注意,调用find不适用于GNU find,因此请使用BSD查找的完整路径。

#/bin/sh

/usr/bin/find ./repo-* -type d -depth 0 -exec git -C {} "$@" \;

答案 2 :(得分:1)

你在"$@"之后,有更好的方法去做你正在做的事情:

find -name .git -prune -execdir git "$@" \;

你可以添加-maxdepth 1或其他任何东西来限制find命令的进一步探索。