Здравствуйте.
Не получается создать переменную, из одних пробелов
Задача состоит в том, чтобы в терминале (через Telnet) выводить заголовки перед каждым определенным действием.
Заголовок состоит из трех строк:
1 - 80 символов "="
2 - Произвольный текст, размещенный по центру окна терминала
3 - 80 символов "="
shell знаю не очень хорошо (Неделя прошла как начал изучать). Застрял на 2-м пункте.Вот такой код функции работает корректно. Строка центрируется.
func_ShowHead() {
local sTab=$1; sLen=${#sTab}; local xS=0; # Привычка из Delphi
if ! [ -z $1 ]; then # Если строка получена
let "xS=80-$sLen"; let "xS=xS/2" # Рассчитываю, сколько пробелов нужно
# вывести перед выводом полученной строки для её центрирования
while [ "$xS" -gt "0" ]; do # Столько раз в цикле
sTab="-"$sTab # !! добавляю вперед строки символ "-" !
let "xS-=1" # уменьшаю счетчик
done
fi
echo $sTab # Вывожу ожидаемый результат
}А если изменить символ "-" на пробел (что, собственно, и нужно) - строка не центрируется.
Вот такой код функции уже работает не корректно. Строка не центрируется.
func_ShowHead() {
local sTab=$1; sLen=${#sTab}; local xS=0;
if ! [ -z $1 ]; then
let "xS=80-$sLen"; let "xS=xS/2"
while [ "$xS" -gt "0" ]; do
sTab=" "$sTab # !!! добавляю вперед строки пробел !!!
let "xS-=1"
done
fi
echo $sTab # Вывожу не корректный результат
}Вызов функции: func_ShowHead "Произвольный текст."
Пробовал заполнять строку символами, а потом заменять и на пробелы функцией tr - тоже не работает.
Даже не знаю, как обмануть интерпретатор. Он, видимо считает пробел ложью и замещает его на null.
Может кто знает более элегантное решение ???
Пишу на Федоре 6 для linux 2.6.6
Спасибо
>[оверквотинг удален]
> # Вывожу не корректный результат
> }
> Вызов функции: func_ShowHead "Произвольный текст."
> Пробовал заполнять строку символами, а потом заменять и на пробелы функцией tr
> - тоже не работает.
> Даже не знаю, как обмануть интерпретатор. Он, видимо считает пробел ложью и
> замещает его на null.
> Может кто знает более элегантное решение ???
> Пишу на Федоре 6 для linux 2.6.6
> СпасибоПробелы нужно экранировать вот так '\ '
> Пробелы нужно экранировать вот так '\ 'Да пробовал я экранировать - строка создается из обратных слэшэв и пробелов. Может какой символ пропускал, может двойными кавычками, не знаю. Вечером попробую. Спасибо.
Тема еще не закрыта.
space=' word';
Сравните:
1) echo $space
word
2) echo "$space"
wordPOSIX, Word Expansions.
If the complete expansion appropriate for a word results in an empty field, that empty field shall be deleted from the list of fields that form the completely expanded command, unless the original word contained single-quote or double-quote characters.
> Может кто знает более элегантное решение ???
> Пишу на Федоре 6 для linux 2.6.6
> СпасибоНу, на. Пишу на баше...
#!/bin/bashfunc_ShowHead() {
local xS
let "xS=(80-${#1})/2" "${#1}==0 || xS<0" \
&& xS=0
printf '%*s%s\n' $xS '' "$1"
}for i in 0 `seq 8 9 89`; do
[ $i = 0 ] && str= || str="$(printf '<%*s>' $i '' |tr \ -)"
echo "$i +$(func_ShowHead "$str")+"
done
>[оверквотинг удален]
> local xS
> let "xS=(80-${#1})/2" "${#1}==0 || xS<0" \
> && xS=0
> printf '%*s%s\n' $xS '' "$1"
> }
> for i in 0 `seq 8 9 89`; do
> [ $i = 0 ] && str=
> || str="$(printf '<%*s>' $i '' |tr \ -)"
> echo "$i +$(func_ShowHead "$str")+"
> done
Мне это пока слишком для понимания. Но выглядит классно. Спасибо. Буду разбираться. Вечером отпишусь.
Все гораздо проще.Чтобы вывести текст в центре строки, надо:
1. найти всю длину строки ($cols);
2. поделить длину всей стройки на 2, чтобы узнать центр ($tcenter);
3. прибавить к $tcenter половину длины строки с текстом ($text)# full line length
cols=$(tput cols)
# my text
text="This is a test text"# calculating center of line
tcenter=$(($cols/2))
# calculating shift using $tcenter and halt of text length
tshift=$(($tcenter+${#text}/2))# making output
printf "%${tshift}s\n" "$text"
Спасибо всем огромное за ответы с примерами.
Я хотя и не понял выражение (printf "%${tshift}s\n"), но последний пример:
cols=80
text="This is a test text"
tcenter=$(($cols/2))
tshift=$(($tcenter+${#text}/2))
printf "%${tshift}s\n" "$text"
у меня заработал.
А этот пример
func_ShowHead() {
local xS
let "xS=(80-${#1})/2" "${#1}==0 || xS<0" \
&& xS=0
printf '%*s%s\n' $xS '' "$1"
}for i in 0 `seq 8 9 89`; do
[ $i = 0 ] && str= || str="$(printf '<%*s>' $i '' |tr \ -)"
echo "$i +$(func_ShowHead "$str")+"
done
я так и не смог выполнить. Показывает ошибку синтаксиса - преждевременное окончание файла. Трудно править синтаксис когда не вижу малейшего смысла в символах.
Надеюсь, со временем я смогу понять что все это значитьЕще раз СПАСИБО всем откликнувшимся на мой SOS. Тему можна считать закрытой.
> Я хотя и не понял выражение
> printf "%${tshift}s\n" "$text"
> у меня заработал.
> А этот пример
#!/bin/bashНе пропустил? И _в исполняемый файл_ положил? И да, допускаю, что могда не подойти даже версия баша. Впрочем, у меня работает, и ладно.
> func_ShowHead() {
> я так и не смог выполнить. Показывает ошибку синтаксиса - преждевременное окончание
> файла. Трудно править синтаксис когда не вижу малейшего смысла в символах.Ну, и ладненько. Лобиться, чтоб они ещё и %) исполнялись -- и можно основывать Культ Баша.
> Надеюсь, со временем я смогу понять что все это значить
Только если будешь этим (шелом, не пониманием, да) заниматься профессионально, фулЬ-тайм.
Синтаксис printf: %<кол-во символов><тип переменной>.
В нашем случае:
% - спец символ
<кол-во символов> == ${#tshift} (это величина, она же длина, сдвига вправо)
s - выводить будем строковое значениеТо есть при ${#tshift} == 80 получим:
printf "%80s" "Foo" - вывести текст Foo со сдвигом вправо на 80 символов.