Как написать сценарий bash или автоматизировать открытие vi и редактирование документа?

(Обратите внимание, у вас опечатка. Вы убрали флаг -nameво втором примере.)

Один из подходов состоит в том, чтобы поместить аргументы в массив и соответствующим образом передать массив в find...

#!/bin/bash
find_args=(-type f -name '*.c' -print0)
while IFS= read -r -d '' file; do
    files+=$file
done < <(find "${find_args[@]}")
echo "${files[@]}"

Формат ${foo[@]}расширяется на все элементы массива, каждый на отдельное слово (, а не на одну строку ). Это ближе по замыслу к оригинальному сценарию.

4
18.10.2019, 21:30
4 ответа

viпо определению является визуальным редактором.

В этом случае, вероятно, лучше использовать какие-то другие средства.

Если вы хотите добавить только эти строки, сделайте что-то вроде:

cat >> filename.sh <<'EOF'
export GRADLE_HOME=/opt/gradle/gradle-5.2.1
export PATH=${GRADLE_HOME}/bin:${PATH}
EOF

Это также будет работать, если файл еще не существует.

Если вы хотите, чтобы эти строки добавлялись в начале, вы можете использовать ed, который представляет собой редактор, ориентированный на строку -:

ed filename.sh <<'EOF'
1i
export GRADLE_HOME=/opt/gradle/gradle-5.2.1
export PATH=${GRADLE_HOME}/bin:${PATH}
.
w
q
EOF

Это указывает edвставлять строки в строку 1; одинокая точка .в строке указывает на конец ввода, поэтому вставка на этом останавливается. Наконец, файл записывается(w)и сеанс редактирования завершается (q).

Если вы настаиваете на использовании ed, даже если файл еще не существует (, и в этом случае я бы использовал пример catвыше ), вы можете использовать это:

ed filename.sh <<'EOF'
i
export GRADLE_HOME=/opt/gradle/gradle-5.2.1
export PATH=${GRADLE_HOME}/bin:${PATH}
.
w filename.sh
q
EOF

Основное отличие состоит в том, что вы не передаете номер строки с помощью команды вставки i, так как строк еще нет; и вы передаете имя файла команде записи w, которая является новым файлом.

sedтоже можно использовать, но для таких задач мне проще использовать ed(и читать, что происходит ).

4
27.01.2020, 20:54

Я бы тоже сделал так, как предлагает @wurtel, но если по какой-то причине вы действительно хотите сделать это с помощью vi , добавьте следующее в ваш файл $HOME/.vimrc:

function AddVars()
    let line1 = "export GRADLE_HOME=/opt/gradle/gradle-5.2.1"
    let line2 = "export PATH=${GRADLE_HOME}/bin:${PATH}"
    call append(line('$'), line1)
    call append(line('$'), line2)
    write
    exit
endf

Затем вызовите vi с помощью опции -c, подобной этой :vi filename.sh -c "call AddVars()"

0
27.01.2020, 20:54

Jenkinsfile является своего рода дополнением к системам контроля версий. Он работает с конвейеры и текстовые файлы.

Это хороший пример для демонстрации интерактивного и запрограммированного подходов, т. е. различий.

Процесс можно разделить на три части, как указывает OQ:

1 )открыть ФАЙЛ в интерактивном (и, следовательно, :визуальном )редакторе

2 )ДОБАВИТЬ 2 строки. Линейные шумовые линии. Добавить (или вставить )куда?

3 )Сохранить. Упомянутые дополнительные :wq. Но мы не делаем ключевые макросы здесь.

Теперь вы переводите на автоматизированный. Во-первых, я упрощаю, документ Wurtel HERE — хорошее начало. Но является ли это законченным «решением»? я предлагаю:

Создайте файл только с этими двумя строками. Они постоянны и содержат знаки доллара. Назовите его gradle-linesпока. В любом случае хорошая инвестиция:

export GRADLE_HOME=/opt/gradle/gradle-5.2.1
export PATH=${GRADLE_HOME}/bin:${PATH}

Теперь можно

cat gradle-lines >>filename.sh

И после

alias grad-append='cat gradle-lines >>'вы можете ввести

град -ap (TAB )имя файла (TAB)

...для запуска псевдонима с именем файла. Любое имя файла.


grad-append filename.shэто сокращение отcat gradle-lines >> filename.sh

Больше мне показать нечего!(Так просто)


Решение с sed -iкажется альтернативой. Обязательно, если вы планируете вставлять эти строки в специальное место. Помимо Perl и т. д., но это другой калибр и здесь он действительно не нужен.

В любом случае это два немного разных элементарных шага :добавление >>и сглаживание.

Но Jenkinspipe и >>двухстрочного -файла должны быть n.p. Для этого нужно больше спецификаций.

ПС:

Я проверил все это. Я имею в виду, что я тестировал гораздо больше, пока не понял, что файла с двумя строками и >>достаточно. Грязный Q!


Я начал этот вопрос с положительной оценки ответа Вюртеля; вот его основное решение, о котором я упоминал выше,ЗДЕСЬ документ. Я должен отдать ему должное, формально. Клянусь, я пошел в обход с info sedи tmpf=mktempи даже cp $(mktemp), но затем добавить к какому файлу? Вот Вюртель ЗДЕСЬ:


Если вы хотите добавить только эти строки, сделайте что-то вроде:

cat >> filename.sh <<'EOF'
export GRADLE_HOME=/opt/gradle/gradle-5.2.1
export PATH=${GRADLE_HOME}/bin:${PATH}
EOF

Это также будет работать, если файл еще не существует.


Если вы поместите это в сценарий или функцию, она будет называться grad-append, как в моем решении. Но это функция (к счастью ), потому что ей нужен (к сожалению )позиционный параметр $1. "filename.sh" теперь жестко закодирован -.

И этому документу также не хватает модульности; функция и данные смешаны. Это может быть идеальным для определенных ситуаций. Но мой вариант более гибкий и прямой.

Что, если он --только раз в то время как --хочет :read gradle-linesвойти в vim в интерактивном режиме? Мое решение имеет многоразовые модули в качестве побочного эффекта.

-1
27.01.2020, 20:54

Для автоматического создания сценариев можно использоватьed

нравитсяed < edit.sed filename.pdf

Чтобы узнать больше, посетитеэтотучебник.

1
27.01.2020, 20:54

Теги

Похожие вопросы