Предоставлено ниже функция, которая раскрашивает каждый другой аргумент, начиная со второго. (Таким образом, не-раскрашенный префикс может быть предоставлен путем передачи непустой строки в этой первой позиции или раскрашенной, оставив ее пустой, как здесь).
Примечательно, что в выполнении этого кода не участвуют подоболочки, за исключением вызовов tput
, используемых в демонстрационных целях. Это, таким образом, в то время как многословные, очень низкие накладные расходы для выполнения.
biwhite=$(tput bold)$(tput setaf 7)
color_off=$(tput sgr0)
# colorize every other argument, starting from the 2nd.
colorize_words() {
local start_color end_color
: "${start_color:=$biwhite}" "${end_color:=$color_off}"
while (($#)); do
printf '%s' "$1"
shift || break
printf '%s%s%s' "$start_color" "$1" "$end_color"
shift || break
done
printf '\n'
}
colorize_words "" "$USER" " at " "$HOME" " has path " "$PATH"
Это может быть настроена путем пропускания start_color
и end_color
значения для индивидуального вызова; например:
# this prints every other argument in red
start_color=$(tput setaf 1) colorize_words "hello " "cruel " world
Не так уж и неразумно спросить - многие другие языки имеют возможность ссылаться на определенный позиционный параметр в своих строках формата. –
Как 'zsh'? * утки * – chepner
Вы не должны помещать '$ USER',' $ HOME' и '$ PATH' в строку формата по той же причине, что и вы не можете просто поместить' $ biwhite' и '$ color_off' в format string: если они содержат процентные знаки, у вас есть проблема. – rici