Как добавить новые строки в переменные в сценарии удара

Для удобства оптимальный метод является комбинацией ответов jmtd и Faheem.

Используя ssh-agent один означает что новый экземпляр ssh-agent потребности, которые будут созданы для каждого нового терминала, Вы открываетесь. keychain при инициализации попросит пароль для закрытого ключа (ключей) и сохранит его. Тем путем Ваш закрытый ключ защищен паролем, но Вы не должны будете вводить свой пароль много раз.

Дуга Wiki рекомендует инициализировать связку ключей от /etc/profile.d/ или Ваш профиль оболочки, такой как .bash_profile или .bashrc. Это имеет недостаток, в котором это инициализирует Вашу связку ключей, как только Вы открываете терминал.

Более гибкий подход должен объединиться keychain с определенным tmux сессия. Так, в .bash_profile:

tsess=$(tmux ls 2>&1)

if [[ "${tsess%%:*}" = "secured" ]] && 
   [[ -f $HOME/.keychain/$HOSTNAME-sh ]]; then
    # start keychain
    /usr/bin/keychain -Q -q --nogui ~/.ssh/id_rsa
    . $HOME/.keychain/$HOSTNAME-sh
fi

... и затем это - просто случай запуска защищенного tmux сессия как и при необходимости (запущенный от keybind):

#!/bin/bash
PID=$(pgrep tmux)
new="tmux -f $HOME/.tmux/conf new -s secured"
old="tmux attach -t secured -d"

if [[ -z "$SSH_AUTH_SOCK" ]]; then
    eval `ssh-agent`
    trap "kill $SSH_AGENT_PID" 0
fi

if [[ -z "$PID" ]]; then
    urxvtc -title "SSH" -e sh -c "${new}"
else
    urxvtc -title "SSH" -e sh -c "${old}"
fi

ssh-add

Теперь, Ваша связка ключей будет только инициализирована однажды при запуске этого конкретного tmux сессия. Пока та сессия сохраняется, Вы сможете получить доступ к ним ssh ключи и нажатие в Ваши удаленные репозитории.

70
03.09.2011, 13:59
8 ответов

В bash можно использовать синтаксис

str=$'Hello World\n===========\n'

Одинарным кавычкам предшествует a $ новый синтаксис, который позволяет вставлять escape-последовательности в строки.

Также printf встроенный позволяет сохранять получающийся вывод к переменной

printf -v str 'Hello World\n===========\n'

Оба решения не требуют подоболочки.

Если в следующем необходимо распечатать строку, необходимо использовать двойные кавычки, как в следующем примере:

echo "$str"

потому что при печати строки без кавычек новая строка преобразовывается в пробелы.

81
27.01.2020, 19:31

Можно поместить литеральные новые строки в одинарных кавычках (в любой оболочке Bourne/POSIX-style).

str='Hello World
===========
'

Для многострочной строки здесь документы часто удобны. Строка питается, как введено к команде.

mycommand <<'EOF'
Hello World
===========
EOF

Если Вы хотите сохранить строку в переменной, используйте cat команда в замене команды. Символ (символы) новой строки в конце строки будет разделен заменой команды. Если Вы хотите сохранить заключительные новые строки, поместите стопор в конец и снимите его позже. В совместимых POSIX оболочках можно записать str=$(cat <<'EOF'); str=${str%a} сопровождаемый heredoc надлежащим, но удар требует, чтобы heredoc появился перед закрывающей скобкой.

str=$(cat <<'EOF'
Hello World
===========
a
EOF
); str=${str%a}

В ksh, ударе и zsh, можно использовать $'…' заключенная в кавычки форма для расширения Escape обратной косой черты в кавычках.

str=$'Hello World\n===========\n'
32
27.01.2020, 19:31
  • 1
    я использую удар GNU 4.1.5, и str=$(cat <<'EOF') не работает как есть.. ) потребности, которые будут помещены в следующую строку после конца документа EOF.. но несмотря на это, это теряет запаздывающую новую строку, должную Управлять Заменой. –  Peter.O 03.09.2011, 19:49
  • 2
    @fred, я объяснил о запаздывающих новых строках и показал код, который работает в ударе. Я думаю, что это - ошибка в ударе, хотя быть честным после перечитывания спецификации POSIX, я нахожу это неясным, что поведение получает мандат, когда <<в замене команды, и heredoc не. –  Gilles 'SO- stop being evil' 04.09.2011, 20:01
  • 3
    Большой материал; сохранить запаздывание (и продвижение) \n экземпляры в bash при получении здесь-документа в переменной рассмотреть IFS= read -r -d '' str <<'EOF'... как альтернатива подходу стопора (см. мой ответ). –  mklement0 08.07.2014, 18:29

Вы используете "эхо"? Попробуйте "эхо-e".

echo -e "Hello World\n===========\n"
9
27.01.2020, 19:31
  • 1
    BTW. Вам не нужен финал \n, потому что echo автоматически добавит один, если Вы не указываете-n. (Однако основной главный удар вопроса, то, как получить эти новые строки в переменную). –  Peter.O 03.09.2011, 11:48
  • 2
    +1 всех решений, этот является самым прямым и самым простым. –  Hai Vu 03.09.2011, 19:11
  • 3
    e, не работает в OS X –  Greg M. Krsak 04.02.2014, 22:21
  • 4
    @GregKrsak: В bash, echo -e действительно работает над OS X - поэтому echo встроенный удар (а не внешний исполняемый файл) и что встроенный действительно поддерживает -e. (Как встроенное, это должно работать над всеми платформами, на которых работает удар; несущественно, echo -e работы в ksh и zsh также). В отличие от этого, однако, внешнее echo утилита на OS X - /bin/echo - действительно не поддерживает -e. –  mklement0 08.07.2014, 17:54

необходимо сделать это этот путь:

STR=$(echo -ne "Hello World\n===========\n")

Обновление:

Поскольку Fred указал на это, этот способ, которым Вы освободите запаздывание "\n". Для присвоения переменной с расширенными последовательностями обратной косой черты сделайте:

STR=$'Hello World\n===========\n\n'

давайте протестируем его:

echo "[[$STR]]"

дает нам теперь:

[[Hello World
===========

]]

Отметьте, тот $'' отличается, чем $ "". Второе делает перевод согласно текущей локали. Поскольку deital видят раздел QUOTING в man bash.

-1
27.01.2020, 19:31

При необходимости в новых строках в сценарии много раз, Вы могли бы объявить глобальную переменную, содержащую новую строку. Тем путем можно использовать его в дважды заключенных в кавычки строках (переменные расширения).

NL=$'\n'
str="Hello World${NL} and here is a variable $PATH ===========${NL}"
4
27.01.2020, 19:31
  • 1
    Почему был бы $'' потребовать подоболочки? –  Mat 10.06.2013, 10:43
  • 2
    Извините, я неправильно читал ответ. –  pihentagy 10.06.2013, 14:19
  • 3
    Я мог попросить объяснение от downvoters? –  pihentagy 23.01.2017, 12:12

Из всего обсуждения вот самый простой путь ко мне:

bash$ str="Hello World
==========="
bash$ echo "$str"
Hello World
===========

Команда эха должна использовать двойные кавычки.

3
27.01.2020, 19:31
[

] В дополнение к замечательным существующим ответам:[

] [

] Если вы используете [] bash[] и предпочитаете [] использование реальных новых строк для удобочитаемости[], [][] read[][] является еще одним вариантом для [] захвата here-doc в переменной [], который (как и другие решения здесь) не требует использования под-оболочки. [

] [
# Reads a here-doc, trimming leading and trailing whitespace.
# Use `IFS= read ...` to preserve it (the trailing \n, here).
read -r -d '' str <<'EOF'   # Use `IFS= read ...` to preserve the trailing \n
Hello World
===========
EOF
] [
# Test: output the variable enclosed in "[...]", to show the value's boundaries.
$ echo "$str"
[Hello World
===========]
] [
    ] [
  • ][

    ][]-r[] гарантирует, что []read[] не будет интерпретировать вход (по умолчанию, он будет обрабатывать специальные обратные слеши, но это редко бывает необходимо). [

    ][
  • ] [
  • ][

    ][]-d ''[] устанавливает разделитель "записи" на пустую строку, заставляя []read[] читать весь вход []whole[] сразу (а не только одну строку). [

    ][
  • ] [
] [

] Обратите внимание, что оставляя []$IFS[] (внутренний разделитель полей) по умолчанию, он не интерпретирует вход, []$' \t\n'[] (пробел, табуляция, новая строка), любой [] ведущий и ведущий пробел обрезается[] от значения, присвоенного []$str[], который включает в себя ведущую новую строку here-doc.[
]. (Заметим, что хотя тело here-doc начинается на строке [] после [] стартового разделителя ([]'EOF'[] здесь), оно не содержит []не[] новой строки []ведущей[]). [

] [

] Обычно это желаемое поведение, но если вы хотите, чтобы трейлинговая новая линия, используйте []IFS=читайте -r -d ''[] вместо простого [] читайте -r -d ''[], но обратите внимание, что [] любые [] ведущие и трейлинговые пробелы белого цвета затем сохраняются.[
]. (Обратите внимание, что подготовка []IFS= [] непосредственно к команде [] read[] означает, что назначение действует только во время выполнения этой команды, поэтому нет необходимости восстанавливать предыдущее значение. )[

] [
] [

]Использование here-doc также позволяет []опционально использовать отступ[] для задания многострочной строки для удобочитаемости:[

] [
# Caveat: indentation must be actual *tab* characters - spaces won't work.
read -r -d '' str <<-'EOF' # NOTE: Only works if the indentation uses actual tab (\t) chars.
    Hello World
    ===========
EOF
] [
# Output the variable enclosed in "[...]", to show the value's boundaries.
# Note how the leading tabs were stripped.
$ echo "$str"
[Hello World
===========]
] [

]Размещение []-[] между []<<[] и открывающим разделителем here-doc ([]'EOF'[], здесь) приводит к тому, что ведущие символы табуляции удаляются из тела here-doc и даже закрывающего разделителя, но обратите внимание, что эта [] работает только с символами []actual[] tab[], а не с пробелами, поэтому, если ваш редактор переводит нажатия клавиш табуляции в пробелы, то потребуется дополнительная работа.[

].
3
27.01.2020, 19:31
#!/bin/bash

result=""

foo="FOO"
bar="BAR"

result+=$(printf '%s' "$foo")$'\n'
result+=$(printf '%s' "$bar")$'\n'

echo "$result"
printf '%s' "$result"

вывод:

FOO
BAR

FOO
BAR
-1
27.01.2020, 19:31

Теги

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