Bash:有条件地输出文本

时间:2016-05-10 03:19:05

标签: bash

所以我正在处理一个脚本,其中一部分正在生成一个文件/目录数组,并打印出来供用户确认它们已被选中。我想以不同于文件的方式为目录着色,就像ls那样。

目前,这是我输出数据的方式:

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

这很有效。我知道如何使用颜色代码来改变printf颜色输出,我只是不知道如何使它成为条件。

为了使事情变得更容易,我使用-p标志来开始输出文件。所以所有目录都以/字符结尾。同样,我不仅完全确定如何编写这种特殊的条件逻辑,即使我知道必须有办法。

提前致谢。

1 个答案:

答案 0 :(得分: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 internal / builtin命令进行迭代和测试,因此对于纯bash解决方案应该尽可能快。