将这些 bash 字符串扩展为正确的 Git 命令的正确方法是什么?

将这些 bash 字符串扩展为正确的 Git 命令的正确方法是什么?

我正在尝试编写一些基本的 bash 脚本,但将这些字符串扩展为Git命令被证明是有问题的。

这个想法是向脚本传递一个顶级目录,其子目录包含 Git 存储库,并在子目录上运行相同的命令,并可以选择tee将输出输出到文件中。

问题是具有额外选项的 git 命令无法正常工作。所以diffstatus命令有效。remote有效,但remote show origin不起作用。例如re选项不起作用。

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

r本案为例,

COMMAND="remote show origin"

其次是

git -C "$d" "$COMMAND"

git看到三个参数,-C, 的值d, 和remote show origin,而不是它期望的五个参数(remoteshoworigin分别代替remote show origin)。

使用bash,只需删除引号即可解决此问题:

git -C "$d" $COMMAND

使用 Zsh,您需要使用以下命令分割字符串

git -C "$d" $=COMMAND

(谢谢伊尔卡丘吉尔斯!)。

答案2

您使用该变量COMMAND来存储字符串列表,但它是字符串变量,而不是列表变量。该指令git -C "$d" "$COMMAND"扩展为四个字:git-C、变量的值d和变量的值COMMAND。如果 的值COMMAND是 例如remote -v则命令行上的第三个参数gitremote -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[@]}"

相关内容