zoukankan      html  css  js  c++  java
  • [ Shell入门教程 ] echo和printf使用实例

        本文主要描述Linux系统中echo和printf命令的使用方法,包括命令参数的含义、使用技巧。

    1、echo

       了解一个命令我们首先要知道它能做什么,它有哪些参数,参数的含义,可以实现我们哪方面的需求。 echo可以直接将字符串打印输出到屏幕,也可以重定向输出到指定文件。

        echo的语法:echo [option] [arguments]。首先看下字符串Hello Word打印

    $ echo "Hello World"
    Hello World
    $

    输出变量值

    $ VAR1="Hello World"
    $ echo "${VAR1}"
    Hello World

    可以观察到输出自动换行了。那如果我不想输出自动换行呢,带上参数-n?

    $ echo -n "Hello World"
    Hello World$ 

       注意观察美元$符号的位置。这只是简单的输出,如果我想格式化输出字符串呢,先看下直接输出的

    $ echo  "Hello	World
    I am Back"
    Hello	World
    I am Back
    $ 

          可以看到,直接输出了 (制表符)、 (换行符),与我们预期不符,加上参数-e,如下

    $ echo -e "Hello	World
    I am Back"
    Hello    World
    I am Back
    $ 

        可以看到, (制表符)、 (换行符)实现了作用,符合我们的预期要求。我们来看下echo所支持的参数和所支持的反斜线控制字符

    echo支持参数:

    -e :启用反斜线控制字符的转换
    -n :取消行末之换行符号(与 -e 选项下的 c 字符同义) 

    echo支持反斜线控制字符:

    
    :NEWLINE,换行字符(常用)
    	:TAB,表格跳位键(常用)
    a:ALERT / BELL (从系统喇叭送出铃声)
    :BACKSPACE ,也就是向左删除键
    c:取消行末之换行符号
    E:ESCAPE,跳脱键
    f:FORMFEED,换页字符
    
    :RETURN,回车键
    v:VERTICAL TAB,垂直表格跳位键
    
    :ASCII 八进位编码(以 x 开首为十六进制)
    \:反斜线本身

       echo除了可以输出字符串内容外,结合重定向符号还可以完成很多工作。比如

      (1)清空文件内容

    $ echo > lion.txt

      (2)创建制定内容的相关文件,比如SQL文件

    $ rm -f select_username.sql
    $ touch select_username.sql
    $ echo "select username from dba_users;" >> select_username.sql
    $ echo "exit" >> select_username.sql

        查看下select_username.sql文件内容

    $ cat select_username.sql 
    select username from dba_users;
    exit

      (3)作为函数函数返回字符串的输出,通常return都是只能返回整数。如下

    #!/bin/bash
    
    function echo_value()
    {
      [ -f select_username.sql ] && echo "Good" || echo "Bad" 
    }
    
    return_str=$(echo_value)
    echo "${return_str}"

      查看输出结果(select_username.sql文件刚创建是存在的,所以判定式为true):

    $ ./example.sh 
    Good

      不太建议这么操作,建议还是使用全局变量去获取值。

      (4)输出带颜色文字,注意这里是需要带参数-e。

    #!/bin/bash

    echo -e "33[31mHello World33[0m"
    echo -e "33[32mHello World33[0m"
    echo -e "33[33mHello World33[0m"
    echo -e "33[34mHello World33[0m"
    echo -e "33[35mHello World33[0m"
    echo -e "33[36mHello World33[0m"
    echo -e "33[37mHello World33[0m"

    说明:30-黑色,31-红色,32-绿色,33-黄色或棕色,34-蓝色,35-紫色,36-青色,37-白色或灰色

    输出结果如下:

    带颜色输出可以起到强调作用,SHELL编程时常用。比如ERROR错误提示用红色告警、INFO信息提示用绿色等。再看下如何打印背景色,如下

    #!/bin/bash
    
    echo -e "33[41mI have a dream!33[0m"
    echo -e "33[42mI have a dream!33[0m"
    echo -e "33[43mI have a dream!33[0m"
    echo -e "33[44mI have a dream!33[0m"
    echo -e "33[45mI have a dream!33[0m"
    echo -e "33[46mI have a dream!33[0m"
    echo -e "33[47mI have a dream!33[0m"

    执行结果如下:

     说明:40-黑色,41-红色,42-绿色,43-黄色或棕色,44-蓝色,45-紫色,46-青色,47-白色或灰色

       到这里我们知道echo命令简单、实用,很多关于输出的需求都可以通过它来实现。但是如果我们想要格式化输出我们的字符串呢?想让我们输出美观一些呢?我们看一个例子

    #!/bin/bash

    NAME_1="Zhangsan"
    ADDRESS_1="GuanDongZhangjiacun"

    NAME_2="Lili"
    ADDRESS_2="HaerbinLicun"

    echo "NAME" "ADDRESS"
    echo "${NAME_1}" "${ADDRESS_1}"
    echo "${NAME_2}" "${ADDRESS_2}"

    输出结果

    NAME ADDRESS
    Zhangsan GuanDongZhangjiacun
    Lili HaerbinLicun

    可以看到输出不是很美观,当然不影响功能。那么可以让输出格式化规范吗?可以,使用printf命令。我们修改下代码,如下

    #!/bin/bash
    
    NAME_1="Zhangsan"
    ADDRESS_1="GuanDongZhangjiacun"
    
    NAME_2="Lili"
    ADDRESS_2="HaerbinLicun"
    
    printf "%10s : %-10s
    " "NAME" "ADDRESS"
    printf "%10s : %-10s
    " "${NAME_1}" "${ADDRESS_1}"
    printf "%10s : %-10s
    " "${NAME_2}" "${ADDRESS_2}"

    查看输出结果:

          NAME : ADDRESS   
      Zhangsan : GuanDongZhangjiacun
          Lili : HaerbinLicun

    可以看到字符串是格式化输出。下面我们来看下printf命令

    2、printf

        printf功能是格式并打印数据(format and print data),printf语法:printf format-string [arguments]

       format-string为描述格式规范的字符串,arguments为参数列表,例如字符串或者变量,建议个数与format-string要求的数量相同。printf的格式指示符如下:

    %c ASCII字符.显示相对应参数的第一个字符
    %d,%i 十进制整数(常用)
    %e 浮点格式([-d].precisione [+-dd])
    %E 浮点格式([-d].precisionE [+-dd])
    %g %e或%f转换,看哪一个较短,则删除结尾的零
    %G %E或%f转换,看哪一个较短,则删除结尾的零
    %s 字符串(常用)
    %u 不带正负号的十进制值
    %x 不带正负号的十六进制.使用a至f表示10至15
    %% 字面意义的%
    %X 不带正负号的十六进制.使用A至F表示10至15

       我们知道,echo已经可以实现我们各种输出的需求,那么我们为什么还要 使用printf呢。原因自然是printf有echo命令不具备的特性。如下

     (1)从命令行引用值

    printf "%s %s" "Hello" "World"

     (2)格式化输出

    printf "%8s %-8s %5.2f
    " "Hello" "World" "1.0"

      说明:

          %-8s表示一个左对齐、宽度为8个字符字符串格式,不足8个字符,右侧补充相应数量的空格符。不带符号-表示右对齐
          %5.2f表示右对齐、5个字符长度的浮点数,其中一个是小数点,小数点后面保留2位

    (3)使用前导0扩展输出

    printf "1%06d" "123" #output 1000123

    (4)与awk结合使用,如下

    awk 'BEGIN{for(i=0;i<=5;i++)printf "1%02d
    ",i}'

    结果如下

    100
    101
    102
    103
    104
    105

      到这里,echo和printf命令介绍结束,在使用时可以结合具体场景进行选择使用。最后我们来看一个打印提示信息的实例

    #!/bin/bash
    
    # -------------------------------------------------------------------------------
    # Function name: prompt_msg()
    # Date         : 2017/04/29
    # Author       : 9527
    # Description  : Pring prompt message to screen
    # Usage        : prompt_msg "INFO" "Hello World"
    # -------------------------------------------------------------------------------
    
    function prompt_msg()
    {
       if [ $# -ne 2 ];then
         printf "33[31mUsage: prompt_msg message_level message_info
    33[0m"
       fi
       
       local msg_level=$1
       local msg_info=$2
       
       if [ ${msg_level} == "INFO" ];then
         printf "${msg_level}: ${msg_info}
    "
       fi
       
       if [ ${msg_level} == "WARN" ];then
         printf "33[33m${msg_level}: ${msg_info}
    33[0m"
       fi
       
       if [ ${msg_level} == "ERROR" ];then
         printf "33[31m${msg_level}: ${msg_info}
    33[0m"
       fi
       
    }
    
    prompt_msg "INFO" "INFO"
    prompt_msg "WARN" "WARN"
    prompt_msg "ERROR" "ERROR"

    运行结果:

     

  • 相关阅读:
    Nginx 基本命令
    Nginx配置详细
    MySQL 函数大全
    X-Frame-Options 配置
    Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
    idea java 非web程序打包
    mysql 存储过程
    webstorm 重置所有设置
    vue input 赋值无效
    MySQL 性能优化神器 Explain 使用分析
  • 原文地址:https://www.cnblogs.com/linyfeng/p/7348287.html
Copyright © 2011-2022 走看看