zoukankan      html  css  js  c++  java
  • shell之echo与printf和颜色

    在用户的bashrc中添加一行export来修改提示符。

    echo printf
    printf命令模仿C程序库(library)里的printf()库程序(library routine)。它几乎复制了
    该函数的所有功能。不过在Shell层级的版本上,会有些差异。由于printf的行为是由POSIX
    标准所定义,因此使用printf的脚本比使用echo移植性好。
    如同echo命令,printf命令可以输出简单的字符串:
    [root@master ~]#printf "Hello, Shell "
    Hello, Shell
    [root@master ~]#
    你应该可以马上发现,最大的不同在于:printf不像echo那样会自动提供一个换行符号。你必须显式
    地将换行符号指定成 。
    echo -n "Enter your name:" //参数-n的作用是不换行,echo默认是换行
    要使转义符生效,需加参数-e

    # echo输出颜色文本
    echo命令改变样式,以输出不同颜色的文本,必须有 -e 选项(开启echo中的转义)。


    在echo命令输出之后附加换行,可以使用 选项:
    $ cat >echo
    #!/bin/bash
    echo -e "this echo's 2 new lines "
    echo "OK"
    echo "The log files have all been done"
    echo "$LOGNAME carried them out at `date`"
    echo ""/dev/rmt0""

    echo "/dev/rmt0"
    /dev/rmt0
    echo ""/dev/rmt0""
    "/dev/rmt0"

    菜单显示,不必多个echo一行行显示,可以一整个echo

    echo "===========================================
    |           ** unix script test              |
    |           1 --- num 1                       |
    |           2 --- num 2                       |
    |           3 --- num 3                       |
    |           4 --- num 4                       |
    ==============================================="

    事实上,echo 除了 -n options 之外,常用选项还有:
    -e :启用反斜线控制字符的转换(参考下表)
    -E :关闭反斜线控制字符的转换(预设如此)
    -n :取消行末之换行符号(与 -e 选项下的 c 字符同意)

    3.1.2.4 ANSI-C Quoting
    Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. Backslash escape sequences, if present, are decoded as follows:
    a
        alert (bell)
    
        backspace

    前面讲到,包围在单引号之内的字符都不会有特殊含义,所以单引号本身并不能在一对单引号中出现。但是在前面加上$之后,就可以使用进行转义了,的转义含义与C语言中的相同。

    关于 echo 命令所支持的反斜线控制字符如下表:
    a:ALERT / BELL (从系统喇叭送出铃声)
    :BACKSPACE ,也就是向左删除键
    c:取消行末之换行符号
    E:ESCAPE,跳脱键
    f:FORMFEED,换页字符
    :NEWLINE,换行字符
    :RETURN,回车键
    :TAB,表格跳位键
    v:VERTICAL TAB,垂直表格跳位键
    :ASCII 八进位编码(以 x 开首为十六进制) :反斜线本身
    $ echo -e "a b c d e f"
    a b c
    d e f

    上例运用 来区隔 abc 还有 def ,及用 将 def 换至下一行。

    例二:

    $ echo -e "1411114211143121441114511146"
    a b c
    d e f

    与例一的结果一样,只是使用 ASCII 八进位编码。

    例三:

    $ echo -e "x61x09x62x09x63x0ax64x09x65x09x66"
    a b c
    d e f

    与例二差不多,只是这次换用 ASCII 十六进制编码。
    测试变量是否已经设置
    有时要测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值。此命令格式为:
    $ { v a r i a b l e : - v a l u e }
    意即如果设置了变量值,则使用它,如果未设置,则取新值。例如:
    $ COLOUR=blue
    $ echo "The sky is ${COLOR:-grey} today"
    The sky is grey today
    变量c o l o u r取值b l u e,e c h o打印变量c o l o u r时,首先查看其是否已赋值,如果查到,则使
    用该值。变量$COLOR没有设置,所以会打印后面的grey

    上面的例子并没有将实际值传给变量,需使用下述命令完成此功能:
    $ { v a r i a b l e : = v a l u e }
    下面是一个更实用的例子。查询工资清单应用的运行时间及清单类型。在运行时间及类
    型输入时,敲回车键表明用户并没有设置两个变量值,将使用缺省值( 0 3 : 0 0和We e k l y),并
    传入a t命令中以按时启动作业。
    #!/bin/bash
    # vartest
    echo "what time do you wish start the payroll [03:00]:"
    read TIME
    echo " process to start at ${TIME:=03:00} OK"
    echo "Is it a monthly or weekly run [Weekly]:"
    read RUN_TYPE
    echo "Run type is ${RUN_TYPE:=Weekly}'
    at -f $RUN_TYPE $TIME
    在输入域敲回车键,输出结果如下:
    what time do you wish start the payroll [03:00]:

    process to start at 03:00 OK
    Is it a monthly or weekly run [Weekly]:

    Run type is Weekly

    在使用putty、secureCRT、XShell等终端仿真器连接linux系统时,ls、vim等工具的输出都含有各种颜色,这些颜色的输出大大地增强了文本的可读性。
    通常我们可以使用echo命令加-e选项输出各种颜色的文本,例如:echo -e "33[31mRed Text33[0m",可以输出红色的字体“Red Text”。其中:"33[31m"和"33[0m"是ANSI转义序列(ANSI escape code/sequence),它控制文本输出的格式、颜色等,大多数的类unix终端仿真器都能够解释ANSI转义序列。
     
    1. ANSI颜色序列格式
    通用的控制文本颜色的转义序列格式如下:
        CSI n1 [;n2 [;…]] m
    其中CSI全称为“控制序列引导器”(Control Sequence Introducer/Initiator),也就是上述示例中的"33["(其中33是你键盘左上角Esc键对应的ascii码(八进制));n1、n2等表示SGR参数(下面会列出一些常用的SGR参数),用于控制颜色、粗体、斜体、闪烁等文本输出格式;m表示转义序列结束。
    注:33是键盘左上角Esc键对应的ASCII码(8进制),33、x1b和e效果一样, 例如:echo -e "x1b[31mRed Texte[0m"也输出红色字体“Red Text”。

    除了shell命令可输出颜色,其它语言中也可以使用上述ANSI转义序列输出颜色(前提是你使用的终端仿真器能够解析ANSI转义序列),以下给出几种主要语言中输出颜色文本的示例。
    注:以下程序仅针对类unix终端有效,win32控制台不支持ANSI转义序列,因而无效。

    http://www.cnblogs.com/crabxx/p/4046498.html

    https://en.wikipedia.org/wiki/ANSI_escape_code

    常用的SRG参数列表如下:

    可以选择的编码如下所示(这些颜色是ANSI标准颜色):
    编码 颜色/动作
    0   重新设置属性到缺省设置
    1   设置粗体
    2   设置一半亮度(模拟彩色显示器的颜色)
    4   设置下划线(模拟彩色显示器的颜色)
    5   设置闪烁
    7   设置反向图象
    22   设置一般密度
    24   关闭下划线
    25   关闭闪烁
    27   关闭反向图象
    30   设置黑色前景
    31   设置红色前景
    32   设置绿色前景
    33   设置黄色前景
    34   设置蓝色前景
    35   设置紫色前景
    36   设置青色前景
    37   设置白色(灰色)前景
    38   在缺省的前景颜色上设置下划线
    39   在缺省的前景颜色上关闭下划线
    40   设置黑色背景
    41   设置红色背景
    42   设置绿色背景
    43   设置黄色背景
    44   设置蓝色背景
    45   设置紫色背景
    46   设置青色背景
    47   设置白色(灰色)背景
    49   设置缺省黑色背景
    其他有趣的代码还有:
    33[2J   清除屏幕
    33[0q   关闭所有的键盘指示灯
    33[1q   设置"滚动锁定"指示灯(Scroll Lock)
    33[2q   设置"数值锁定"指示灯(Num Lock)
    33[3q   设置"大写锁定"指示灯(Caps Lock)
    33[15:40H 把关闭移动到第15行,40列
    07    发蜂鸣生beep

    33与e是一样功能

    a ASCII 响铃字符(也可以键入 07)
    e ASCII 转义字符(也可以键入 33)

    下面看几个例子:

    echo -e "33[30m 黑色字 33[0m"
    echo -e "33[31m 红色字 33[0m"
    echo -e "33[32m 绿色字 33[0m"
    echo -e "33[33m 黄色字 33[0m"
    echo -e "33[34m 蓝色字 33[0m"
    echo -e "33[35m 紫色字 33[0m"
    echo -e "33[36m 天蓝字 33[0m"
    echo -e "33[37m 白色字 33[0m"
     

    echo -e "33[40;37m 黑底白字 33[0m"
    echo -e "33[41;37m 红底白字 33[0m"
    echo -e "33[42;37m 绿底白字 33[0m"
    echo -e "33[43;37m 黄底白字 33[0m"
    echo -e "33[44;37m 蓝底白字 33[0m"
    echo -e "33[45;37m 紫底白字 33[0m"
    echo -e "33[46;37m 天蓝底白字 33[0m"
    echo -e "33[47;30m 白底黑字 33[0m"

    控制选项说明 :

    m前面的0可以省略。

    33[0m 关闭所有属性
    33[1m 设置高亮度
    33[4m 下划线
    33[5m 闪烁
    33[7m 反显
    33[8m 消隐
    33[30m -- 37m 设置前景色
    33[40m -- 47m 设置背景色 
    33[nA 光标上移n行
    33[nB 光标下移n行
    33[nC 光标右移n行
    33[nD 光标左移n行
    33[y;xH设置光标位置
    33[2J 清屏
    33[K 清除从光标到行尾的内容
    33[s 保存光标位置
    33[u 恢复光标位置
    33[?25l 隐藏光标
    33[?25h 显示光标

    顺序无关,只需要记忆数值所代表的含义即可,因为数值已经限定了是背景还是前景之类的

    文本终端的显示颜色可以使用“ANSI非常规字符序列”来生成。
    例如:echo -e "33[44;37;5m ME33[0m COOL"
    解释:"33[44;37;5m ME "设置背景为蓝色,前景为白色,闪烁光标,输出字符“ME”;
    "33[0m COOL"重新设置屏幕到缺省设置,输出字符 “COOL”。
    "e"是命令echo的一个可选项,它用于激活特殊字符的解析器。"33"引导非常规字符序列(即"33["表示终端转义字符开始,"33"即退出键<ESC>的ASCII码)。"m"意味着设置属性然后结束非常规字符序列,这个例子里真正有效的字符是"44;37;5"和"0"。修改"44;37;5"可以生成不同颜色的组合,数值和编码的前后顺序没有关系。

    echo显示带颜色,需要使用参数-e
    格式如下:
    echo -e "33[字背景颜色;文字颜色m字符串33[0m"
    例如:
    echo -e "33[41;37m TonyZhang 33[0m"

    echo -e "e[41;37m TonyZhang e[0m"
    其中41的位置代表底色, 37的位置是代表字的颜色

     注:
    1、字背景颜色和文字颜色之间是英文的“""”
    2、文字颜色后面有个m
    3、字符串前后可以没有空格,如果有的话,输出也是同样有空格

    一些说明:
    前景颜色各数字是对应背景颜色减去10。
    结束非常规字符序列的"m"要紧跟前面的数字,不能有空格。
    命令也可以写成echo -e "^[[44;37;5m ME 33[0m COOL",其中的"^["是先按Ctrl-V,然后再按<ESC>键产生的。
    输出带有颜色的文本,echo命令必须带有选项"-e"。
    这种方法只能暂时改变echo命令输出的文本的样式,logout后就恢复为默认。修改.bashrc文件,可以修改默认的显示样式。
    如:在.bashrc文件的最后面追加一行:echo -e '33[47;30m'。

    # echo命令的其他用法
    光标跳到第60列,然后显示一个OK。
    格式:echo -en '33[60G' && echo OK
    说明:"33["是终端转义字符开始,60G是命令。

    添加颜色相当容易,第一步是设计不带颜色的提示行;
    添加终端(而不是 bash)可识别的专用转义序列,以使它以彩色显示文本的某些部分。
    标准 Linux 终端和 X 终端允许您设置前景(文字)颜色和背景颜色,如果需要,还可以启用 "bold" 字符。
    有八种颜色可供我们选择。前景编号 (30-37) 和背景编号 (40-47)
    颜色是通过在 PS1 中添加专用序列来选择的──基本上是夹在 "e["(转义开方括号)和 "m" 之间数字值。如果指定一个以上的数字代码,则用分号将它们分开。下面是一个颜色代码示例:"e[0m"
    如果将数字代码指定为零,则它就会通知终端将前景、背景和加粗设置重置为它们的默认值。您可能会在提示行结束时使用这个代码,以使您键入的文字成为非彩色的。

    我已说明了如何在提示行中添加信息和颜色,但您还可以更进一步。您可以通过在提示行中添加专用代码来使 X 终端(如 rxvt 或 aterm)的标题栏得到动态更新。您所要做的只是将下面的序列添加到您的 PS1 提示行中:
    "/e]2;titlebar/a"
    只须用您希望其出现在 xterm 标题栏中的文字替换子串 "titlebar" 即可,现在已经一切就绪了!不必使用静态文字;您可以将 bash 转义序列插入标题栏中。请查看下面这个示例,它将用户名、主机名和当前工作目录显示在标题栏中,并定义了一个简短、明亮的绿色提示行:
    export PS1="/[/e]2;/u@/H /w/a/e[32;1m/]>/[/e[0m/] "
    因为它将全部信息显示在标题栏上,而不是显示在终端上,终端对一行可以显示多少字符有限 制。顺便提一句,确保用 "/[" 和 "/]" 将您的标题栏序列括起来(因为就终端而言,这个序列是非打印序列)。将大量信息放在标题栏中的问题是,如果您使用非图形终端(如系统控制台),则看不到这 些信息。为了解决这个问题,可以在您的 .bashrc 中添加以下几行:
    if [ "$TERM" = "linux" ]
    then
    #we're on the system console or maybe telnetting in
    export PS1="/[/e[32;1m/]/u@/H > /[/e[0m/]"
    else
    #we're not on the console, assume an xterm
    export PS1="/[/e]2;/u@/H /w/a/e[32;1m/]>/[/e[0m/] "
    fi
    这个 bash 条件语句将根据当前的终端设置动态设置提示行。为了获得一致性,您一定希望配置您的 ~/.bash_profile,以便它在启动时搜索 (source) 您的 ~/.bashrc。确保您的 ~/.bash_profile 文件中有以下这样一行:
    source ~/.bashrc

    颜色码表

    #!/bin/bash
    T='samples'
    echo
    echo "        default   40m       41m       42m       43m       44m       45m       46m       47m"
    ## FG 为前景(foreground)色, BG 为背景(background)色
    for FGs in '    m' '   1m' '  30m' '1;30m' '  31m' '1;31m' '  32m' '1;32m' '  33m' '1;33m' '  34m' '1;34m' '  35m' '1;35m' '  36m' '1;36m' '  37m' '1;37m'
            do
            FG=$(echo $FGs|tr -d ' ')
            echo -en " $FGs 33[$FG $T "
            for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
                    do
                    echo -en " 33[$FG33[$BG $T 33[0m"
            done
            echo
    done
    echo
    vi cfont
    cfont() {
    while (($#!=0)) do case $1 in -b) echo -ne " "; ;; -t) echo -ne " "; ;; -n)
                  echo -ne " "; ;; -black) echo -ne "33[30m"; ;; -red) echo -ne "33[31m"; ;; -green) echo -ne "33[32m"; ;; -yellow) echo -ne "33[33m"; ;; -blue) echo -ne "33[34m"; ;; -purple) echo -ne "33[35m"; ;; -cyan) echo -ne "33[36m"; ;; -white|-gray) echo -ne "33[37m"; ;; -reset) echo -ne "33[0m"; ;; -h|-help|--help) echo "Usage: cfont -color1 message1 -color2 message2 ..."; echo "eg: cfont -red [ -blue message1 message2 -red ]"; ;; *) echo -ne "$1" ;; esac shift done }
    source cfont  #将此函数放入当前shell环境中,然后才能执行
    cfont -cyan
    cfont -reset
  • 相关阅读:
    maven
    in 和 or 的效率问题
    mac 安装homobrew 报错解决
    卷积的本质及物理意义
    java 多线程 day18 ThreadPoolExecutor
    打jar包
    科三保佑贴
    【问题解决】-《java.lang.NoClassDefFoundException》
    POS-商户手续费-从生活剖析,通俗易懂
    关于荒废空闲时光的思考
  • 原文地址:https://www.cnblogs.com/createyuan/p/3778367.html
Copyright © 2011-2022 走看看