Почему эта функция bash для раскрашивания текста печатает только первое слово всей строки? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь создать функцию, которая будет печатать сообщение, привязанное к переменной, определенного цвета. Переменная сообщения передается в качестве аргумента этой функции. Проблема в том, что я получаю только текст до первого пробела (только первое слово сообщения). Мой скрипт выглядит так:

#!/usr/bash

lbGREEN='\e[1;92m'
NC='\e[0m'

normalMessage="Everything fine"

echo_message() {

    echo -e  ${lbGREEN}$1${NC}

}

echo_message $normalMessage 

Мой вывод:

Everything

Ответы [ 4 ]

0 голосов
/ 09 мая 2018

Вы ошиблись в цитировании.

Если вы хотите смоделировать поведение echo, ваша функция должна принять несколько параметров и распечатать их все. В настоящее время он оценивает только первый параметр, поэтому я предлагаю использовать $*. Вам также необходимо заключить аргумент в двойные кавычки для защиты любых специальных символов:

echo_message() {
    echo -e  "${lbGREEN}$*${NC}"
}

Специальная переменная $* распространяется на все аргументы, разделенные пробелами (или, точнее, первым символом $ IFS, который обычно является пробелом). Обратите внимание, что вы почти всегда хотите "$@" вместо "$*", и это один из редких случаев, когда последний также является правильным, хотя и с немного другой семантикой, если для IFS установлено нестандартное значение.

Теперь функция поддерживает несколько аргументов и печатает их все зеленым цветом, разделенные пробелами. Однако я бы порекомендовал вам также указывать аргумент при вызове функции:

echo_message "$normalMessage"

Хотя пробелы в $normalMessage теперь будут обрабатываться правильно, другие специальные символы, такие как !, по-прежнему будут нуждаться в кавычках.

0 голосов
/ 09 мая 2018

Вы должны взглянуть на https://stackoverflow.com/a/6212408/1428602

ИМХО, $ 1 возвращает только первое слово, поэтому вы должны использовать цикл или попробовать с $ *

0 голосов
/ 09 мая 2018

Как отметил Иньян в комментариях, ваша проблема - расширение переменной без кавычек

echo_message $normalMessage 

становится

echo_message Everything fine

как только переменная раскрывается, это означает, что каждое слово вашей входной строки читается как отдельный аргумент. Когда это происходит $1=Everything и $2=fine.

Это исправляется двойной кавычкой вашей переменной, что позволяет расширение, но будет означать, что результат расширения будет по-прежнему считаться одним аргументом.

echo_message "$normalMessage"

становится

echo_message "Everything fine"

Как это $1=Everything fine

В будущем я рекомендую использовать https://www.shellcheck.net/, или CLI-версию shellcheck, она будет выделять все виды распространенных ошибок bash, включая расширение без кавычек.

0 голосов
/ 09 мая 2018

Мне пришлось изменить заголовок на "#! / Bin / bash", но, видимо, это не проблема для вас.

В вашем эхо вы печатаете только первое слово с$ 1, если вы измените его на $ 2, вы напечатаете второе слово (параметр) и т. Д.

Вы можете передать имя внутри кавычек или распечатать все параметры с помощью $ @

Решение 1(с $ @):

lbGREEN='\e[1;92m'
NC='\e[0m'
normalMessage="Everything fine"
echo_message() {
    echo -e  ${lbGREEN}$@${NC}
}
echo_message $normalMessage

Решение 2 (с кавычками):

lbGREEN='\e[1;92m'
NC='\e[0m'
normalMessage="Everything fine"
echo_message() {
    echo -e  ${lbGREEN}$1${NC}
}
echo_message "$normalMessage"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...