echo命令

-- TOC --

echo可能是Linux中最简单的命令之一了,它的功能就是将输入回显。

回显

$ echo a b c d
a b c d
$ echo cs.pynote.net
cs.pynote.net
$ echo abc 123 abc 456
abc 123 abc 456
$ echo a    b       8
a b 8

echo命令后面可以带多个以空格间隔的参数,多个连续空格会被缩减到一个空格。

$ echo "123
> 456"
123
456
$ echo 'a
> b
> c'
a
b
c
$ echo a\
> b\
> c
abc

还可以回显多行内容,用单引号或双引号括起来即可,或者使用 \(没有换行)。

$ echo $PATH
/home/xinlin/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ echo $SHELL
/bin/bash
$ a=cs.pynote.net
$ echo $a
cs.pynote.net
$ echo '$a'
$a
$ echo "$a"
cs.pynote.net
$ echo "${a} is good!"
cs.pynote.net is good!

用echo命令显示变量内容,注意单引号和双引号的区别!单引号'原样输出,双引号"会将变量展开!{}是为了区别出变量名称的边界。

空格在Shell命令行是分隔符,用来区分一行命令的各个组成部分,因此 a=cs.pynote.net 中间不能有空格,否则 a 会被当成某个命令来执行,会失败。

-n参数

-n参数,no newline,用来取消末尾的换行,默认echo命令会加上一个换行。

$ echo -n 'input: '; read b
input: cs.pynote.net
$ echo $b
cs.pynote.net

如果没有-n参数,输入光标就会出现在input打印的下一行。

-e参数

-e参数,escape,使能backslash escape。

$ echo '12345\nabcde'
12345\nabcde
$ echo -e '12345\nabcde'
12345
abcde

Shell中的简单输出使用echo,复杂格式输出使用printf。

小把戏:用echo命令让电脑发出声音

$ echo -e '\a'

echo命令在处理escape的时候,不区分单引号或双引号。

用echo查看特殊变量

与查看其它普通变量无异,只是特殊变量有特殊的名称:

$ echo $$  # current bash process id
127360
$ echo $-  # current bash options
himBHs

$$ 表示当前bash进程的id;

$- 表示当前bash的options。(命令行option可以用-开始)

参考:Bash中的特殊变量

彩色的输出

让echo命令输出彩色的内容,需要使用参数 -e,格式:

$ echo -e "\033[背景色;前景色;显示方式m输出字符串\033[0m"
$ echo -e "\e[...mXXXX\e[0m"

颜色值

前景 颜色 背景 颜色
30 无色 40 黑色
31 红色 41 红色
32 绿色 42 绿色
33 黄色 43 黄色
34 蓝色 44 蓝色
35 紫色 45 紫红色
36 青色 46 青蓝色
37 白色 47 白色
- - 0 透明

显示方式

代码 样式
0 关闭所有属性
1 高亮显示
4 下划线
5 闪烁
7 反显
8 消隐
22 非粗体
24 非下划线
25 非闪烁
27 非反显

控制选项

代码 属性
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[m:nH 把光标移动到第m行第n列
\033[K 清除从光标到行尾的内容
\033[y;xH 设置光标位置
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
\033[2J 清除屏幕
\007 发出蜂鸣声beep
\033[0q 关闭所有的键盘指示灯
\033[1q 设置“滚动锁定”指示灯 (Scroll Lock)
\033[2q 设置“数值锁定”指示灯 (Num Lock)
\033[3q 设置“大写锁定”指示灯 (Caps Lock)

测试:

echo_colorful

历史上,Terminal是一种device,现在基本都是xterm,控制这种device的指令,包含在向其输入的字符流中!现代计算机已经没有Terminal这种device了,取而代之的都是Screen,当需要Terminal的时候,其实都是Terminal Emulator。

一点历史:TTY

echo --version

因为基本上主流shell实现都内置了echo命令(内置的目的时可以获得更快的执行效率,不用查找命令的位置,不用fork),内置的echo无法查看version:

$ echo --version
--version
$ type echo
echo is a shell builtin

原样回显,只因builtin。

此时,可以这样,使用executable的完整pathname

$ /usr/bin/echo --version
echo (GNU coreutils) 9.0
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Brian Fox and Chet Ramey.

本文链接:https://cs.pynote.net/sf/linux/shell/202110145/

-- EOF --

-- MORE --