Отделение параметров команды от строк в сценарии Bash - PullRequest
2 голосов
/ 06 мая 2020

Ищу способ написать функцию, вызывающую git commit с несколькими сообщениями; например:

git commit -m "This is the commit headline" -m "This is a new paragraph for the commit" -m "Adding paragraphs makes it easier to give details" 

Et c.

Дело в том, что мне не удается найти эффективный способ express в скрипте, какой параметр (-m) и что строка / сообщение.

Вот что у меня есть:

function commit(){ 
  if [[ $# > 1 ]]
  then
    commit_body=`echo $2 | cut -d '=' -f 2`
    IFS='|' read -r -a paragraphs <<< "$commit_body"
    git commit -m "$1" $(for p in "${paragraphs[@]}"; do echo -n "-m $p"; done)
  else
    git commit -m "$1"
  fi
}

Функция будет вызываться путем выполнения:

commit "Commit headline" body="1st paragraph for the commit|2nd paragraph"

Проблема в том, что в моя функция, аргумент "-m" рассматривается как строка командой git commit. Но если я возьму его из строки «echo», тогда он станет аргументом команды echo, чего я не хочу.

У вас есть какие-нибудь указания, как это обойти?

1 Ответ

4 голосов
/ 06 мая 2020

Возможно, что-то вроде этого сработает:

#!/bin/bash

function commit() {
        options=("-m" "$1")

        if [[ $# > 1 ]]
        then
                commit_body=`echo "$2" | cut -d '=' -f 2`
                IFS='|' read -r -a paragraphs <<< "$commit_body"
                for msg in "${paragraphs[@]}"
                do
                        options+=("-m" "${msg}")
                done
        fi

        git commit "${options[@]}"
}

commit "Commit headline" body="1st paragraph for the commit|2nd paragraph"
$ bash -x commit.sh
+ commit 'Commit headline' 'body=1st paragraph for the commit|2nd paragraph'
+ options=("-m" "$1")
+ [[ 2 > 1 ]]
++ echo 'body=1st paragraph for the commit|2nd paragraph'
++ cut -d = -f 2
+ commit_body='1st paragraph for the commit|2nd paragraph'
+ IFS='|'
+ read -r -a paragraphs
+ for msg in "${paragraphs[@]}"
+ options+=("-m" "${msg}")
+ for msg in "${paragraphs[@]}"
+ options+=("-m" "${msg}")
+ git commit -m 'Commit headline' -m '1st paragraph for the commit' -m '2nd paragraph'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...