Хочу чтобы в скриптах сохранялись табуляции для удобного чтения, но если их там оставлять то многострочный вывод вроде такого:echo "что то там
и ещё что-то там
"приведёт к тому, что в консоли только первая строка начнётся с начала строки а остальные строки будут сдвинуты вправо согласно табуляции. Из за этого пишу все скрипты длинным монолитом без табуляции на условиях и циклах что потом аукается при отладке.
Можно как-то отключать вывод табуляции в echo, либо как её удалить?
Я вообще вывожу текст через собственные функции-оформляшки, могу внедрить удаление табуляций туда. Попытался таким образом:# штатная болтовня
tellifl() {
local s=$1
s=${s//\t/}
echo -en "$(tput setaf 2; tput bold)$s$(tput sgr0)"
}то есть удалить через s=${s//\t/} - ничего не вышло. Все табуляции на месте. Хотя сама конструкция s=${s//\t/} успешно работает "в стендовых примерах"...
Ааа! Табуляцию нужно было удалять по реальной табуляции а не по "\t" теперь всё работает:
delTabIFL() {
echo "${1//" "/}"
}
tellifl() {
echo -en "$(tput setaf 2; tput bold)$(delTabIFL "$1")$(tput sgr0)"
}
Есть правда пара минусов у такой реализации:
Почему-то обрубает финальный перенос строки если он оформлен нажатием на Enter а не через \n.
То есть такой вариант:
tellifl "fdsfsfd
dffgdfgdfg
dfsfdsfd
"
выводит всё это без последнего переноса строки. Если нужен перенос строки в конце нужно юзать именно \n а не Enter:
tellifl "fdsfsfd
dffgdfgdfg
dfsfdsfd
\n"
Проблема номер 2 загадочна и непонятна - если редактировать текст скрипта в Atom то иногда табуляции никак не вырезаются пока не переоткроешь Atom и не сотрёшь все проблемные табуляции и не сделаешь их заново. (Случилось 1 раз)
Проблема № 2 решается отключением в текстовом редакторе функции soft tab (замена символа табуляции на пробелы)
> Хочу чтобы в скриптах сохранялись табуляции для удобного чтения, но если их
> там оставлять то многострочный вывод вроде такого:
> echo "что то там
> и ещё что-то там
> "Есть такой редирект - "<<-". Например
cat <<- ...
что то там
и ещё что-то там
...Скусывает ТАБУЛЯЦИЮ в начале строк.
> Есть такой редирект - "<<-". НапримерБлин, конкретно по этому редиректу инфы не нашёл. Ни разу не пользовался им и вообще редиректами ввода. Можете показать пример рабочего кода, чтобы я въехал как при помощи него на экран многострочный текст выводить?
>> Есть такой редирект - "<<-". Например
> Блин, конкретно по этому редиректу инфы не нашёл. Ни разу не пользовался
> им и вообще редиректами ввода. Можете показать пример рабочего кода, чтобы
> я въехал как при помощи него на экран многострочный текст выводить?То, что я показал и есть пример рабочего кода. Сделай copy/paste, только в начале строк поставь не пробелы, а табуляции. INPUT TEXT в web не понимает, что такое табуляция. Посмотри, что получится.
#!/bin/bashcat <<- ...
слова
слова
...
>[оверквотинг удален]
> То, что я показал и есть пример рабочего кода. Сделай copy/paste, только
> в начале строк поставь не пробелы, а табуляции. INPUT TEXT в
> web не понимает, что такое табуляция. Посмотри, что получится.
>
> #!/bin/bash
> cat <<- ...
> слова
> слова
> ...
>Документацию смотри здесь https://tldp.org/LDP/abs/html/here-docs.html
Спасибо! Понял: любой набор символов после <<- и тот же набор символов в последней строке - это ограничители сообщения, вот этого не понимал, думал - это троеточия от балды и не писал их) Код действительно работает в такой форме и действительно съедает табы но увы воспользоваться такой конструкцией я не смогу. Дело в том, что если передать туда текст при помощи переменной, а текст в переменной будет с табуляциями - эти табуляции будут сохранены. Жаль. Этот вариант с редиректом не съедает последний перенос строки, эта проблема была бы решена.
Вот если что код который я пытался реализовать:
tellifl() {
cat <<- ...
$(tput setaf 2; tput bold)$1$(tput sgr0)
...
}#применение функции:
tellifl "длинный
многострочный
текст
с табуляциями"
Ладно, вприниципе проблема съедения последнего переноса строки не такая уж и проблема, просто заменять его на \n, да больше времени занимает чем Enter, но зато код компактнее.