echo

echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
该命令的一般格式为:echo [ -n ] 字符串
其中选项n表示输出文字后不换行;字符串能加引号,也能不加引号。用echo命令输出加引号的字符串时,将字符串原样输出;用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分割。

1.命令格式:

echo [-ne][字符串]或 echo [--help][--version]

补充说明:
echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号。

3.命令参数:

-n 不要在最后自动换行
-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
   \a 发出警告声;
   \b 删除前一个字符;
   \c 最后不加上换行符号;
   \f 换行但光标仍旧停留在原来的位置;
   \n 换行且光标移至行首;
   \r 光标移至行首,但不换行;
   \t 插入tab;
   \v 与\f相同;
   \\ 插入\字符;
   \nnn 插入nnn(八进制)所代表的ASCII字符;
–help 显示帮助
–version 显示版本信息

echo显示颜色
echo显示颜色,需要使用参数-e

格式如下:

echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"
例如: 
echo -e "\033[41;37m TonyZhang \033[0m"
其中41的位置代表底色, 37的位置是代表字的颜色

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

下面看几个例子:

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


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

echo -e "\033[42;31;1m 绿底红字高亮 \033[0m"

控制选项说明 :

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

echo输出!的问题

name="hello world"
[root@RHEL ~]# echo "$name Install Completed !"
-bash: !": event not found

因为 ! 会被当作命令行历史替换的符号来处理。不过在shell脚本中没有这样的问题,因为在脚本中Bash历史记录被关闭了。不幸的是,无法使用转义符来转义!:

[root@RHEL ~]# echo "$name Install Completed \!" 
hello world Install Completed \!

1、使用单引号

[root@RHEL ~]# echo '$name Install Completed !'
$name Install Completed !

这样会原样的输出字符串,不进行转义,不取变量值

2、 set +H 来取消命令行历史替换。

[root@RHEL ~]# set +H
[root@RHEL ~]# echo "$name Install Completed !"
hello world Install Completed !

3、! 后面加空格

[root@RHEL ~]# echo "$name Install Completed ! "
hello world Install Completed ! (这里有空格)

4、不要将叹号放入 "" 中

[root@RHEL ~]# echo "$name Install Completed "!
hello world Install Completed !

#不能有两个!, !!表示上一个 执行的命令
[root@RHEL ~]# echo "$name Install Completed "echo "$name Install Completed "!!
echo "$name Install Completed "echo "$name Install Completed "ifconfig
hello world Install Completed echo hello world Install Completed ifconfig

#也不能在!后面加数字, !1表示第一个历史命令
[root@RHEL ~]# echo "$name Install Completed "echo "$name Install Completed "!1
echo "$name Install Completed "echo "$name Install Completed "ifconfig 
hello world Install Completed echo hello world Install Completed ifconfig

5、不使用引号,问题同上一条

[root@RHEL ~]# echo $name Install Completed !
hello world Install Completed !

6、不使用引号,且在叹号前面加上转义字符\

[root@RHEL ~]# echo $name Install Completed \!\!
hello world Install Completed !!

echo 输出json格式

echo '{"name":"zhangsan", "age":"18"}'

[root@localhost ~]# echo '{"name":"zhangsan", "age":"18"}'
{"name":"zhangsan", "age":"18"}
[root@localhost ~]#

首先,大括号外面必须有单引号'',因为在shell里面大括号{}不用单引号引起来就相当于一个匿名函数,
不加单引号就等价去echo 输出 {"name":"zhangsan", "age":"18"} 这个匿名函数的返回值。
其次,大括号里面的字符串,必须用"" 双引号,不能用''单引号,否则会报错。

当大括号中带有变量时该怎么输出呢?
echo 后面的内容已经被''单引号引起来了,shell自身已经不可能再去解析变量了,那么只能我们职级手动去解析,这时候就想到eval命令,eval的一个功能就是将自己的参数变量进行展开,具体关于eval的命令,自行网上搜索吧,下面直接给出答案。

echo $(eval echo '{\"name\":\"zhangsan\", \"age\":\"$age\"}')

注意,第一个echo不是必须的,所以也可以是

eval echo '{\"name\":\"zhangsan\", \"age\":\"$age\"}'

还可以将变量放在'的外面

echo '{\"name\":\"zhangsan\", \"age\":\"'$age'\"}'