您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Shell echo/printf 命令

1. Shell 命令

与其他语言一样,Shell 也有字符串的及格式化字符的需求,在本章节我们着重讲解 Shell 中的 echo 与 printf 命令,灵活运用这两个命令,基本上就能满足我们在 Shell 编写中的大多数及格式化字符串的需求。

在我们编写 Shell 脚本的时候需要为提供信息以及交互式,也存在需要记录脚本的执行日志等,此时都需要我们来根据不同的场景,利用 Shell 的命令也称命令来满足我们的需求。

2. Shell echo 命令操作

我们明确了 Shell 命令的含义及作用,首选让我们来看 echo 命令及基本操作。

echo 命令语法非常简单:echo [option] [arguments],其中根据 option 的不同,赋予了 echo 很多强大的。

通常认不带参数就是处理打印普通字符串,例如:

[root@master ~]# echo "hello shell"hello shell

认 echo 普通字符串为换行的,如果不想换行,可以选项 -n,例如:

[root@master ~]# echo -n "hello shell"hello shell[root@master ~]#

我们可以看到此时就不换行,该需求可以在我们写的时候使用。

在我们前面讲解变量的时候,有提到过在引用变量的时候可以利用 echo 命令,但是此时需要我们注意单引号与双引号的区别。

单引号

单引号为将变量名原样,不引用其的值,例如:

[root@master ~]# STR1="hello shell"[root@master ~]# echo '${STR1}'${STR1}

双引号

双引号为引用变量的值进行,例如:

[root@master ~]# echo "${STR1}"hello shell[root@master ~]# echo ${STR1}hello shell

我们可以发现在终端如果不显式书写引号,认就为双引号,也就是引用我们变量的值,但是我们在编写 Shell 脚本的时候尽可能地写上引号,这样可以避免不必要的异常发生。

echo 命令使用 -e 选项可以开启转义,处理特殊字符。

\n: 换行符号

[root@master ~]# echo -e "hello\nshell" hello
shell

\t: 制表符,也就是按我们的 tab 键

[root@master ~]# echo -e "hello\tshell" hello   shell

\r: 回车键,RETURN

[root@master ~]# echo -e "hello\r"    hello		

\a: 从系统喇叭送出铃声,ALERT

[root@master ~]# echo -e "\a"

\\:反斜线本身

[root@master ~]# echo -e "hello \\ shell"hello \ shell

\f:FORM,换页字符

[root@master ~]# echo -e "hello\fshell" hello
     shell

\E:ESCAPE,跳脱键

[root@master ~]# echo -e "hello \Eshell"hello hell

可以利用 echo 命令来,例如:

[root@master ~]# ls test.shls: cannot access test.sh: No such file or directory[root@master ~]# echo "hello shell" >test.sh[root@master ~]# cat test.sh hello shell[root@master ~]#

如果需要在中写入简单,不用然后打开,可以直接利用 echo 命令将输入到中,会创建。

清空

可以利用 echo 来清空,例如:

[root@master ~]# cat test.sh hello shell[root@master ~]# echo >test.sh [root@master ~]# cat test.sh

在 echo 中,如果使用双引号其中带有 ! 则会抛出异常,这是因为认 Shell 开启了感叹号引用内存中的历史命令,可以利用 set +H 进行,如果不该设置还想使用感叹号,可以使用单引号。

[root@master ~]# echo "hello !"-bash: !": event not found[root@master ~]# echo 'hello !'hello !

在 Shell 中我们有时候需要与进行交互式操作,如果的有颜色,对于识别更为明显。Shell 中 echo 可以对字体颜色 / 背景 / 方式进行控制,如下表:

方式

for i in {1..8};do echo -e "\033[$i;31;40m hello shell \033[0m";done

字体颜色

for i in {30..37};do echo -e "\033[$i;40m hello shell \033[0m";done

背景颜色

for i in {40..47};do echo -e "\033[47;${i}m hello shell \033[0m";done

3. Shell 中 printf 命令操作

我们学习了 echo 命令,它通常用于处理常规的需求,还有一些更高级的需求,例如我们希望指定字符的宽度,左右对齐,格式小数等,此场景下需要利用 printf 命令进行处理。

printf 为格式化打印数据,语法为:printf format-string [arguments]

format-string: 为格式控制字符串;

arguments: 为参数列表。

其引用 C 语言中的 printf 命令,但 也有一些区别,需要注意:

printf 认情况下末尾不加换行符号,所以如果需要换行,需要手动 \n;

printf 为格式化不对做改变操作,尤其在浮点数的时候,对其结果不进行改变,这是现实结果有差异;

在 printf 中 arguments 为参数列表,例如字符串或者变量,建议个数与 format-string 要求的相同;

printf 不用加括号,arguments 使用空格分隔,不用逗号。

[root@master ~]# printf "hello shell"hello shell[root@master ~]# printf "hello shell\n"hello shell

如果需要换行,需要手动显式 \n

在掌握 printf 前需要先了解 format-string,其对应着不同的含义,在此我们介绍最常用的格式字符串。

字符串格式化,其中 就是引用后面的字符 shell

[root@master ~]# printf "hello \n" shellhello shell

%d

十进制整数

[root@master ~]# printf "age: %d\n" 20      age:

左对齐

printf 可以使得左对齐,例如 %-10s 指宽度为 10 个字符,左对齐利用 - 表示,任何字符都会被在 10 个字符宽的字符内,如果不足则以空格填充,超过也会将全部出来。

[root@master ~]# printf "hello %-10s\n" shell 。      hello shell     。

右边对齐

右对齐利用 + 表示,%+10.2f 指格式化为小数,其中 10 表示 4 个字符宽度,.2 指保留 2 位小数。

[root@master ~]# printf "hello %+10s\n" shell 。 hello      shell。[root@master ~]# printf "hello %+10.2f \n" 3.1415 。	hello      + 。

其他

当然一些其他格式化字符,在此举例最常用的,其他的可参考如下:

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

单双引号

在 printf 中,单双引号都一致。

[root@master ~]# printf "hello \n" shellhello shell[root@master ~]# printf 'hello \n' shell hello shell

格式只指定了参数,但多出的参数仍然会按照该格式,format-string 被重用进行多行

[root@master ~]# printf 'hello \n' shell python gohello shell
hello python
hello go[root@master ~]# printf "   \n" a b c d e f g h i j
   
  g h
i j

如果没有 arguments,那么则对应使用认值表示, % s 用 NULL 代替,% d 用 0 代替

[root@master ~]# printf " default  %d \n" 
 default

printf 的转义与 echo 中的一致,可参考 echo 中的转义。

4. 实例

例如给出如下 的访问日志,需要对其进行分析并且不同的状态码,利用颜色不同进行区分不同的状态码。

. - - [/Nov/::: +] "GET /js/chunk-2eca3a5a.2f1d5ea3.js HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-". - - [/Nov/::: +] "GET /js/chunk-91d36e6e.a1444c20.js HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-". - - [/Nov/::: +] "GET /js/chunk-vendors.3a6c246c.js HTTP/1.1" 	  "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) Apessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /js/app.ec4e6290.js HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /js/chunk-vendors.3a6c246c.js HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /api/2 HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /js/chunk-2eca3a5a.2f1d5ea3.js HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /css/chunk-91d36e6e.a5cb4df4.css HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /js/chunk-03341f87.78501520.js HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /js/chunk-91d36e6e.a1444c20.js HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /api/1 HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /img/download.f4b65200.png HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /img/background.fc2d80f1.png HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /img/peitu.a89ef99f.svg HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /fonts/element-icons.535877f5.woff HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /img/download.f4b65200.png HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-". - - [/Nov/::: +] "GET /img/scan.d3d981fc.png HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-". - - [/Nov/::: +] "GET /img/background.fc2d80f1.png HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-". - - [/Nov/::: +] "GET /img/peitu.a89ef99f.svg HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-". - - [/Nov/::: +] "GET /index HTTP/1.1"   "-" "Mozilla/5.0 (iPhone;  iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.8(0x17000820) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /css/app.7d918353.css HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.8(0x17000820) NetType/4G Language/zh_CN" "-". - - [/Nov/::: +] "GET /js/app.ec4e6290.js HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone;  iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.8(0x17000820) NetType/4G Language/zh_CN" "-"

可以利用上节课的数组进行状态存储,之后利用每个状态的来利用 echo 颜色进行区分。

将 访问日志存储为 .log,可以利用 cat 命令来

cat > .log <<EOF. - - [/Nov/::: +] "GET /js/chunk-2eca3a5a.2f1d5ea3.js HTTP/1.1"   "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-"...EOF

编写,其中为们利用 cut 对 日志进行分割,状态码的列尾第九列

#!/bin/bash# Description:  status# Auth: kaliarch# Email: kaliarch@163.com# function:  status check# Date: 2020-03-21 14:00# Version: 1.0# 对输入的日志进行判断_LOG=$# 定义管理数组declare -A HTTP_STATUS# 对数组进行赋值# 利用netstat命令来过滤出关系的一列数据for status in $(cat ${_LOG} |cut -" " -)do# 对状态相同状态的HTTP进行数值累加let HTTP_STATUS[${status}]++done# 将完成的TCP状态及数据记录到日志中for i in ${!HTTP_STATUS[@]}do if [ ${i} -eq  ];thenecho - "\033[34;40m${_LOG}中状态码为${i}的为${HTTP_STATUS[${i}]} \033[0m"elif [ ${i} -eq  ];thenecho - "\033[31;40m${_LOG}中状态码为${i}的为${HTTP_STATUS[${i}]} \033[0m"elif [ ${i} -eq  ];thenecho - "\033[32;40m${_LOG}中状态码为${i}的为${HTTP_STATUS[${i}]} \033[0m"elseecho - "\033[36;40m${_LOG}中状态码为${i}的为${HTTP_STATUS[${i}]} \033[0m"fi
done

执行结果

[root@master shell_echo]# bash _status.sh .log 
.log中状态码为200的为17 
.log中状态码为的为1 
.log中状态码为的为2 
.log中状态码为500的为2

5. 注意事项

在 echo 变量引用时,我们推荐勤用引号,单引号为原样字符串,双引号为变量的值;

printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植更好,如果后期考虑平台移植问题,建议使用 printf

6. 小结

在 shell 中我们可以利用 echo 来记录程序的日志,或对进行新增输入,或利用其进行颜色打印,可以带有颜色的漂亮。在设计多平台移植性问题的时候,为们可以优先考虑 printf,对于数组显可以使用 printf 来完成,灵活运用使得脚本编写更为方便灵活。


联系我
置顶