сценарий удара, эхо производится в поле

Я не знаю если приложение "автоматизировать" обслуживание crontab. То, что я делаю, является содержанием 'основной' crontab, отредактируйте это, затем используйте crontab ~/etc/app.cron или что-то подобное. Затем это было бы достаточно легкий создать что-то для автоматизации модификации ~/etc/app.cron.

Для именованных заданий, как Вы хотите, необходимо будет или создать мини-базу данных с именами задания или добавить имя задания к структурированному комментарию в конце crontab строки.

6
30.03.2013, 17:08
4 ответа

Как Ваша хижина и синтаксис указывает непортативный bash, Я предпочитаю его этот путь:

function box_out()
{
  local s="$*"
  tput setaf 3
  echo " -${s//?/-}-
| ${s//?/ } |
| $(tput setaf 4)$s$(tput setaf 3) |
| ${s//?/ } |
 -${s//?/-}-"
  tput sgr 0
}

Конечно, можно оптимизировать его, если Вы желаете.

Обновление согласно просьбе в комментарии, для обработки многострочного текста также.

function box_out()
{
  local s=("$@") b w
  for l in "${s[@]}"; do
    ((w<${#l})) && { b="$l"; w="${#l}"; }
  done
  tput setaf 3
  echo " -${b//?/-}-
| ${b//?/ } |"
  for l in "${s[@]}"; do
    printf '| %s%*s%s |\n' "$(tput setaf 4)" "-$w" "$l" "$(tput setaf 3)"
  done
  echo "| ${b//?/ } |
 -${b//?/-}-"
  tput sgr 0
}

Назовите его с несколькими параметрами, как box_out 'first line' 'more line' 'even more line'.

15
27.01.2020, 20:20
  • 1
    Потрясающий.............. Вы - Ведущее устройство.... –  Rahul Patil 31.03.2013, 11:29
  • 2
    Как я применил бы эту функцию к нескольким строкам или одну строку с \n ввести CRS? –  TryTryAgain 02.06.2016, 20:48
  • 3
    @manatwork конфигурации, это чудесно, НО... он не работает на расширение переменных... и затем если я пробую какое-либо заключение в кавычки для разрешения, он печатает на одной строке снова. Огромное спасибо за быстрый ответ и блестящее решение! –  TryTryAgain 02.06.2016, 22:17
  • 4
    должно произойти перед выполняемой функцией box_out. Двойные кавычки и Escape должны все еще работать, как обычно: pastebin.com/ekmUKUkn Между прочим, Вы также используете bash, право? –  manatwork 03.06.2016, 10:20
  • 5
    @AndreasStorvikStrauman: ${s[@]} – все элементы массива s; ((w<${#l}))((..)) окружите тестирование арифметики, является ли значение переменного w меньше, чем переменная l длина значения, полученная с расширением параметра (# – длина строки); ${b//?/-} – расширение параметра, заменяющее все случаи любого символа с “-” (// – замените все; ? – подстановочный знак, означающий любой символ). –  manatwork 07.04.2018, 20:31

Итак, мое решение не совсем такое же, как ваше, но, строго говоря, оно печатает рамку вокруг текста, и реализация немного проще, поэтому я решил поделиться.

banner() {
    msg="# $* #"
    edge=$(echo "$msg" | sed 's/./#/g')
    echo "$edge"
    echo "$msg"
    echo "$edge"
}

И вот он в действии:

$ banner "hi"
######
# hi #
######
$ banner "hi there"
############
# hi there #
############

Просто обычный текст, никаких причудливых цветов ansi или чего-то еще.

5
27.01.2020, 20:20

Коробки!

$ echo 'Love Unix & Linux' | boxes -d stone -p a2v1
+---------------------+
|                     |
|  Love Unix & Linux  |
|                     |
+---------------------+

Поскольку boxesтребует, чтобы текст был отправлен в виде файла, я рекомендую использовать синтаксис в приведенном выше примере, где текст передается в boxesecho.

"Почему boxes?"

Пользоваться им легко. Просто скажите, какой дизайн границы вы хотите использовать и как вы хотите, чтобы он выглядел, и все готово.

Конечно, если вы хотите проявить творческий подход, вы можете создать свой собственный дизайн. Это действительно легко и весело делать. Единственным недостатком использования boxesявляется то, что я не понял, как центрировать поле, сгенерированное с помощью boxes, чтобы выровнять центр по экрану, хотя для этого есть лайфхак

"А как насчет цвета?"

Первоначальный вопрос продемонстрировал использование цветовых кодов. Поэтому кажется правильным показать, как boxesсправится с этим.

Несмотря на то, что tputпопулярен, я считаю себя приверженцем старой школы Bash и до сих пор люблю использовать escape-команды. Я уверен, что на StackExchange есть несколько человек, которые будут возражать против этого, но каждому свое. Как бы то ни было, я готов отложить в сторону свое личное предпочтение сделать это, чтобы включить еще один пример, делающий это способом tput.

Естественно, я думаю, что первым шагом будет установка цвета внутреннего текста. Итак, давайте сделаем это в первую очередь.

printf "$(tput setaf 4)Love Unix & Linux$(tput sgr 0)" | boxes -d stone -p a2v1
+---------------------------------+
|                                 |
|  Love Unix & Linux  |
|                                 |
+---------------------------------+

Если бы это было в терминале, Love Unix & Linuxбыл бы синим... однако, как вы можете видеть, boxesне справился с этим хорошо. Так что же не так?

printf "$(tput setaf 4)Love Unix & Linux$(tput sgr 0)" | boxes -d stone -p a2v1 | cat -A
+---------------------------------+$
|                                 |$
|  ^[[34mLove Unix & Linux^[(B^[[0m  |$
|                                 |$
+---------------------------------+$

Более внимательное рассмотрение путем отображения скрытых символов с помощью cat -Aпоказывает, что boxesпредполагает, что длина блока включает длину текста И escape-символы.

Однако следует отметить, что если вы используете программу, подобную lolcat, вне из boxes, вывод будет выглядеть следующим образом

$ echo 'Love Unix & Linux' | boxes -d stone -p a2v1 | lolcat -f
+---------------------+
|                     |
|  Love Unix & Linux  |
|                     |
+---------------------+

но с рамкой и текстом в цветах радуги.

Хорошо, что я еще не сделал свои собственные бордюры с цветовыми кодами,как я полагаю, дизайн границ будет подвержен тем же проблемам.

Центрирование текста, рисунков ASCII и блоков!!!

Другой недостаток boxesзаключается в том, что если вы знаете, как использовать Bash для центрирования текста по краю терминала, boxesвсе равно будет выравнивать поле по левому краю экрана. Разобрался.

Если вы хотите центрировать текст, который не находится в рамке, вы можете просто использовать

center(){
  COLS=$(tput cols)  # use the current width of the terminal.
  printf "%*s\n" "$(((${#1}+${COLS})/2))" "$1"
}

И используйте это, чтобы центрировать одну строку текста.

center 'Love Unix & Linux'

Для изображений ascii -, где используется несколько строк и их необходимо зафиксировать на месте, существует эта опция.

# Rather than removing text, even things out by padding lines with spaces
draw_banner(){
  local banner="$1"
  # Banner Width
  BW=$(cat $banner | awk '{print length}' | sort -nr | head -1)

  while IFS= read -r line; do
    line=$(echo "${line}" | sed -n -e 's/^  / /g;p')
    line=$(printf "%-${BW}s" "${line}")
    center "${line}"  # our center function from earlier.
  done < "$banner"
}

draw_banner "path/to/your_ascii_art_logo.txt"

Но если вам нравится использовать такие вещи, как figlet, вам не нужно использовать эти функции, так как опция -cпредоставляет возможность центрировать.

$figfontdir="path/to/figlet/fonts"
$figfont="Alligator"
text_banner(){
  COLS=$(tput cols)  # use the width of the terminal!
  figlet -d "$figfontdir" -f "$figfont" -k -w $COLS -c "$1"
}

text_banner 'Love Unix & Linux'

Для boxesмы делаем что-то похожее на draw_banner(), но нам нужно передать данные!

# Center a box created with `boxes
# It's like draw_banner, but `<<<` reads a string of data rather than a file.
$boxfile="/path/to/your_box_designs.box" # or ".txt". I like ".box".
$boxdesgin="stone"
center_box(){
  local data="$(</dev/stdin)"  # Read from standard input
  # Banner Width
  BW=$(cat <<< ${data} | awk '{print length}' | sort -nr | head -1)

  while IFS= read -r line; do
    line=$(echo "${line}" | sed -n -e 's/^  / /g;p')
    line=$(printf "%-${BW}s" "${line}")
    center "${line}"  # our center command from earlier.
  done <<< "${data}"
}

(
 # A bunch of stuff to center!
) | boxes -f $boxfile -d $boxdesign -a hcvcjc | center_box

Нерешенные вопросы

Устранение обеих этих проблем проблемы с символами UTF/ANSI не только сделало бы boxesлучшее решение для инкапсуляции текста в поле ASCII, но и позволило бы использовать творческую альтернативу, которую можно было бы использовать вместо этого. ручных -кодировочных ящиков.

6
27.01.2020, 20:20

Взял комментарий @robru и немного улучшил его, чтобы разрешить многострочный текст.

  function PP () {
  local longest=0
  local string_array=("${@}")
  for i in "${string_array[@]}"; do
    if [[ "${#i}" -gt "${longest}" ]]; then
      local longest=${#i}
      local longest_line="${i}" # Longest line
    fi
  done

  local edge=$(echo "$longest_line" | sed 's/./#/g' | sed 's/^#/###/' | sed 's/#$/###/')
  local middle_edge=$(echo "$longest_line" | sed 's/./\ /g' | sed 's/^\ /#\  /' | sed 's/\ $/\ \ #/')

  echo -e "\n${edge}"
  echo "${middle_edge}"

  for i in "${string_array[@]}"; do
    local length_i=${#i}
    local length_ll="${#longest_line}"
    if [[ "${length_i}" -lt "${length_ll}"  ]]; then
            printf "# "
            local remaining_spaces=$((length_ll-length_l))
            printf "${i}"
            while [[ ${remaining_spaces} -gt ${#i} ]]; do
                    printf " "
                    local remaining_spaces=$((remaining_spaces-1))
            done
            printf " #\n"
    else
      echo "# ${i} #"
    fi
  done

  echo "${middle_edge}"
  echo -e "${edge}\n"
}

Итак, Если написать PP "Hi." "I'm Here" "Nice to meet you......"Вы получите следующее:

##########################
#                        #
# Hi.                    #
# I'm Here               #
# Nice to meet you...... #
#                        #
##########################
0
07.08.2020, 17:52

Теги

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