Напишите сценарий Bash для загрузки переменного числа файлов .gitignore в зависимости от количества аргументов в команде? - PullRequest
1 голос
/ 23 марта 2020

Как мне написать gitignore Python в командной строке и запустить его

curl https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore > ./.gitignore

и иметь gitignore Python macOS do

curl https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore https://raw.githubusercontent.com/github/gitignore/master/macOS.gitignore > ./.gitignore

Число аргументов после gitignore будет переменным.

1 Ответ

2 голосов
/ 23 марта 2020

tl; dr: Go в конец

Звучит так, как будто вы хотите написать bash функцию для l oop поверх аргументов и записать вывод в .gitignore. Здесь есть три понятия, через которые можно go пройти: l oop итерация, расширение переменной и перенаправление stdout.

Во-первых, вам нужно тело функции, которое создается с помощью funcname() { ...; } (; необязательно, если вы разбиваете конечную скобку на собственную строку).

Во-вторых, вам нужно перебирать параметры, переданные этой функции. $@ - это специальная переменная в bash, которая устанавливается для всех несмещенных параметров в данном скрипте / функции. Чтобы l oop сверх этого, вы можете использовать конструкцию для l oop: for i in "${@}". Фигурные скобки вокруг @ являются необязательными, но кавычки обязательны, так как вы не хотите расширять funcname "a" "b c", чтобы оценить до трех l oop итераций. Чтобы узнать больше, посмотрите разделение IFS.

В-третьих, вы хотите расширить свою новую переменную i в середине URL-адреса. Убедитесь, что это двойные кавычки:

for i in "${@}"; do
  curl "https://raw.githubusercontent.com/github/gitignore/master/${i}.gitignore"
done

Наконец, вы хотите записать все это в файл .gitignore. Может показаться интуитивно понятным просто добавить >.gitignore в конце команды curl, но на самом деле вы хотите поставить его после done. Это связано с тем, что будет выполняться такой вызов, как funcname Python macOS:

curl "https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore" >.gitignore
curl "https://raw.githubusercontent.com/github/gitignore/master/macOS.gitignore" >.gitignore

Оператор перенаправления > перезапишет gitignore с содержимым python, а затем перезапишет его снова с содержимым macOS. Вы действительно хотите захватить стандартный вывод обеих команд и перезаписать .gitignore их содержимым (в качестве альтернативы вы можете сделать это с помощью >>, но многократный запуск вашей команды приведет к дублированию строк в вашем .gitignore).

Итак, ваша последняя функция будет:

gitignore() {
  for i in "${@}"; do
    curl "https://raw.githubusercontent.com/github/gitignore/master/${i}.gitignore"
  done >.gitignore
}
...