我正在尝试编写一些基本的 bash 脚本,但将这些字符串扩展为Git
命令被证明是有问题的。
这个想法是向脚本传递一个顶级目录,其子目录包含 Git 存储库,并在子目录上运行相同的命令,并可以选择tee
将输出输出到文件中。
问题是具有额外选项的 git 命令无法正常工作。所以diff
和status
命令有效。remote
有效,但remote show origin
不起作用。例如r
和e
选项不起作用。
processing /home/vfclists/project1/
git: 'remote -v' is not a git command. See 'git --help'.
processing /home/vfclists/project1/
git: 'remote show origin' is not a git command. See 'git --help'.
问题是来自bash
扩张还是来自Git
自身,或者两者兼而有之?
#!/bin/bash
usage()
{
cat << EOF
checkrepos command output file
usage: $0 options
OPTIONS:
commands
r remote show origin
d diff
s status
e remote
other options
-d directory
-t filename for tee
EOF
}
WD=$(pwd)
echo "working directory $WD"
while getopts "c:t:v:h:" OPTION
do
case $OPTION in
c)
case $OPTARG in
r)
COMMAND="remote show origin"
;;
d)
COMMAND="diff"
;;
s)
COMMAND="status"
;;
e)
COMMAND="remote -v"
;;
esac
;;
t)
OUTPUTFILE=$OPTARG
;;
v)
VERBOSE=1
;;
h)
usage
exit 1
;;
?)
usage
exit
;;
esac
done
if [[ -z $COMMAND ]]
then
echo 'command is required'
usage
exit 1
fi
for d in $WD/* ; do
echo ""
echo "===================="
echo ""
echo "processing $d"
git -C "$d" "$COMMAND"
echo ""
echo "===================="
echo ""
done
答案1
答案2
您使用该变量COMMAND
来存储字符串列表,但它是字符串变量,而不是列表变量。该指令git -C "$d" "$COMMAND"
扩展为四个字:git
、-C
、变量的值d
和变量的值COMMAND
。如果 的值COMMAND
是 例如remote -v
则命令行上的第三个参数git
是remote -v
,git 不理解。
要传递单独的参数,请将它们存储在字符串列表中,即大批。 shell 编程中的“数组”是指字符串列表。
COMMAND=()
…
e) COMMAND=(remote -v);;
…
if ((${#COMMAND[@]} == 0)); then
echo >&2 "Missing command"
usage >&2
exit 2
fi
…
git -d "$d" "${COMMAND[@]}"