Не может расположить heredoc с отступом для соответствия отступу вложения

Согласно документации для очереди sysfs файлы:

# cat /sys/block/sda/queue/hw_sector_size
512

63
27.01.2015, 16:32
6 ответов

Можно изменить оператор здесь-документа на <<-. Можно затем расположить с отступом и здесь-документ и разделитель с вкладками:

#! /bin/bash
cat <<-EOF
    indented
    EOF
echo Done

Обратите внимание, что необходимо использовать вкладки, не пробелы для расположения с отступом здесь-документа. Это означает, что вышеупомянутый пример не будет работать скопированный (Exchange стека заменяет вкладки пробелами). Не может быть никаких кавычек вокруг первого EOF разделитель, еще расширение параметра, замена команды и арифметическое расширение не в действительности.

118
27.01.2020, 19:32
  • 1
    Прохладный, который решает проблему отступа, но теперь она не разворачивает переменную, которую я пытаюсь поместить там ($dateLastChanged) если я делаю hypen+quotes вещь в Вашем примере, но если я вынимаю дефис и кавычки и помещаю EOI на новую строку, это начинает разворачивать его снова. –  Bratchley 20.05.2013, 21:17
  • 2
    @JoelDavis: Просто удалите кавычки, сохраните дефис. –  choroba 20.05.2013, 21:37
  • 3
    Быть Вызванным использовать вкладки является очень раздражающим. Существует ли хороший путь вокруг этого? –  con-f-use 19.11.2015, 20:25
  • 4
    @con-f-use: можно попробовать что-то как cat << EOF | sed 's/^ *//' и так далее. –  choroba 19.11.2015, 21:33
  • 5
    Или еще лучше: cat <<- EOF | awk 'NR==1 && match($0, /^ +/){n=RLENGTH} {print substr($0, n+1)}'. Это удаляет сумму предыдущих пробелов в первой строке от каждой строки в сюда документ (благодаря anubhava). –  con-f-use 21.11.2015, 12:40

вы можете подключить его к sed:

.... | sed -n "/0.1.0/,/1.0.2/p" YourFile
5
27.01.2020, 19:32

Хм ... Похоже, вы можете сделать лучшее преимущество - формат аргумента здесь - Направьте вместо этого и просто пройти на трубку. Кроме того, ваш если ... Fi - это составное командование - он может взять перенаправление, которое все содержащие команды наследуют, поэтому, может быть, вам не нужно вообще не нужно гнездить.

if      [ "$diffLines" = 1 ]
then    stat --printf "Last Change: %.19y\n\n$(cat)\n" /.bbdata |
        mailx   -r  "Systems and Operations <sysadmin@[redacted].edu>" \
                -s  "Warning Stale BB Data" 'jadavis6@[redacted].edu'
else    echo    "$diffLines have changed"
fi      <<\STALE
This is an automated warning of stale data for the UNC-G Blackboard Snapshot process.
STALE
2
27.01.2020, 19:32

Другой метод был бы ивидением:

    mail_content="Last Change: $dateLastChanged

    This is an automated warning of stale data for the UNC-G Blackboard Snapshot process."
    mailx -r "Systems and Operations <sysadmin@[redacted].edu>" -s "Warning Stale BB Data" jadavis6@[redacted].edu <<<"$mail_content"
0
27.01.2020, 19:32

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

$     cat << '    EOF'
>         indented
>     EOF
        indented
$     cat << '    EOF' | sed -r 's/^ {8}//'
>         unindented
>     EOF
unindented

Однако я не мог придумать, как использовать этот трюк и сохранить раскрытие параметров.

17
27.01.2020, 19:32

Этот ответ специфичен для GNU -Bash -.

Хитрость заключается в том, что мы используем <<<одно -слово здесь -doc, предлагаемое Bash, и делаем его составной -позицией.

Мы также избегаем UUoC :нам не нужен процесс catдля подачи входных данных вsed:

$ sed '1d;s/^    //' <<<"
    {
       TERM=$TERM
    }
    bye"

Вывод показывает, что четыре пробела в начале -удалены и $TERMрасширены:

{
   TERM=xterm-256color
}
bye

Команда 1dв sedпредназначена для удаления первой пустой строки, которая существует, потому что наш литерал в кавычках начинается с новой строки после открывающей кавычки.

Конечно, в реальном сценарии, для которого это в dent ed — простите, в tended ed — мы бы выровняли фигурные скобки с помощью команды sed, который будет иметь отступ внутри цикла или условного оператора.

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

while command ; do
    if condition ; then
        variable=$(sed '1d;s/^.*|//' <<<"
                  |{
                  |   TERM=$TERM
                  |}
                  |bye
                  ")
    fi
done

Последняя идея — поместить магию отступа в переменную, которая используется как своего рода макрос:

# put in some common definitions library section
indent='sed 1d;s/^.*|//'

#...

while command ; do
    if condition ; then
        variable=$($indent <<<"
                  |{
                  |   TERM=$TERM
                  |}
                  |bye
                  ")
    fi
done

Мы можем улучшить это, написав старую добрую -модную функцию:

# put in some common definitions library section
ind()
{
   sed '1d;s/^.*|//' <<<$1
}

#...

while command ; do
    if condition ; then
        variable=$(ind "
                  |{
                  |   TERM=$TERM
                  |}
                  |bye
                  ")
    fi
done

Тогда мы полностью абстрагируем <<<.

0
26.10.2021, 20:49

Теги

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