Ответ 1
(Если вы используете bash
4, прокрутите до конца, чтобы я считал, что это лучшая комбинация чистой оболочки и читаемости.)
Для сценариев оболочки использование вкладок не является вопросом предпочтения или стиля; как определить язык.
usage () {
# Lines between EOF are each indented with the same number of tabs
# Spaces can follow the tabs for in-document indentation
cat <<-EOF
Hello, this is a cool program.
This should get unindented.
This code should stay indented:
something() {
echo It works, yo!;
}
That all.
EOF
}
Другой вариант - вообще избежать этого документа за счет использования большего количества кавычек и продолжения строк:
usage () {
printf '%s\n' \
"Hello, this is a cool program." \
"This should get unindented." \
"This code should stay indented:" \
" something() {" \
" echo It works, yo!" \
" }" \
"That all."
}
Если вы хотите отказаться от совместимости с POSIX, вы можете использовать массив, чтобы избежать явного продолжения строки:
usage () {
message=(
"Hello, this is a cool program."
"This should get unindented."
"This code should stay indented:"
" something() {"
" echo It works, yo!"
" }"
"That all."
)
printf '%s\n' "${message[@]}"
}
В следующем документе снова используется документ, но на этот раз с командой bash
4 readarray
для заполнения массива. Расширение параметров заботится об удалении фиксированного числа пробелов с начала каждой ложь.
usage () {
# No tabs necessary!
readarray message <<' EOF'
Hello, this is a cool program.
This should get unindented.
This code should stay indented:
something() {
echo It works, yo!;
}
That all.
EOF
# Each line is indented an extra 8 spaces, so strip them
printf '%s' "${message[@]# }"
}
Один из последних вариантов: вы можете использовать расширенный шаблон для упрощения расширения параметров. Вместо того, чтобы подсчитывать, сколько пробелов используется для отступов, просто закончите отступ выбранным непространственным символом, а затем сопоставьте фиксированный префикс. Я использую :
. (Пространство, следующее
двоеточие - для удобочитаемости; его можно отбросить с незначительным изменением шаблона префикса.)
(Кроме того, в качестве недостатка, один из недостатков вашего замечательного трюка использования разделителя здесь-документа, начинающегося с пробела, заключается в том, что он мешает вам выполнять расширения внутри этого документа. Если вы хотите сделать это, вы 'd необходимо либо оставить разделитель незакрепленным, либо сделать одно небольшое исключение из вашего правила без табуляции, а использовать <<-EOF
и разделитель закрытия с табуреткой.)
usage () {
# No tabs necessary!
closing="That all"
readarray message <<EOF
: Hello, this is a cool program.
: This should get unindented.
: This code should stay indented:
: something() {
: echo It works, yo!;
: }
: $closing
EOF
shopt -s extglob
printf '%s' "${message[@]#+( ): }"
shopt -u extglob
}