(Обратите внимание, у вас опечатка. Вы убрали флаг -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[@]}
расширяется на все элементы массива, каждый на отдельное слово (, а не на одну строку ). Это ближе по замыслу к оригинальному сценарию.
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
(и читать, что происходит ).
Я бы тоже сделал так, как предлагает @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()"
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 в интерактивном режиме? Мое решение имеет многоразовые модули в качестве побочного эффекта.