2016-05-10 5 views
2

Итак, я работаю над скриптом, где часть его генерирует массив файлов/каталогов и распечатывает их для подтверждения пользователем того, что они были выбраны правильно. Я хотел бы покрасить каталоги по-разному, чем файлы, например ls.Bash: условно текст вывода цвета

В настоящее время, вот как я вывода данных:

printf ' %q\n' "${files[@]}" 

Это прекрасно работает. Я знаю, как использовать цветовые коды для изменения вывода цвета printf, я просто не знаю, как сделать это условным.

Чтобы облегчить ситуацию, я использую флаг -p для начала вывода файла. Таким образом, все каталоги заканчиваются символом /. Опять же, я не просто полностью уверен, как написать эту конкретную условную логику, даже если я знаю, что должен быть способ.

Заранее спасибо.

+0

Как объявить 2 переменные, которые содержат формат для файлов/каталогов, затем перебирают ваш список и '[-d" $ i "] && printf" $ colorfmt "" $ i "|| printf "$ plainfmt" "$ i" '? –

+0

'-d' выглядит более * дорогим *, что' [["$ 1" ~ * /]] '? (или что бы то ни было, точные символы совпадения оболочки). В противном случае, отличный материал! Опубликуйте как ответ, и я поднимусь. Всем удачи. – shellter

ответ

0

Это следует сделать это:

# input files 
files=$(ls -p) 

# array with formatted file names 
formatted_files=() 

# a few demo ANSI coloring codes 
ANSI_RESET=$(tput sgr0) 
ANSI_BOLD=$(tput bold) 
ANSI_GREEN=$(tput setaf 2) 

# iterate over input files, conditionally coloring 
# and appending to formatted files array 
for file in ${files[@]}; do 
    if [[ "$file" =~ /$ ]]; then 
     formatted_files+=("$ANSI_BOLD$file$ANSI_RESET") 
    else 
     formatted_files+=("$ANSI_GREEN$file$ANSI_RESET") 
    fi 
done 

# output (directories bold, files green) 
printf ' %q\n' "${formatted_files[@]}" 

Когда итерация файлов, мы тестируем для каталогов с Баш регулярных выражений оператора в выражении теста двойных скобок. Файл является каталогом, если он заканчивается косой чертой /$.

Примечание. Мы используем только внутренние команды bash для встроенных/встроенных команд для итерации и тестирования, поэтому это должно быть как можно быстрее для чистого решения bash.

Смежные вопросы