echo

功能: 用于输出一行内容。

用法

1
2
$ echo [SHORT-OPTION]... [STRING]...
$ echo LONG-OPTION

选项说明

选项 说明
-n 不输出末尾的空行(如果有的话)
-e 允许使用反斜杆转义
-E 禁止使用反斜杠转义(默认)
--help 打印帮助
--version 打印版本信息

转义符

如果带 -e 选项,则可以识别转义符。常见的转义符有:

转义符 说明
\\ 反斜杆
\a 蜂鸣
\b 退格
\c 不输出末尾的空行
\e <ESC> 键
\f form feed
\n 新行
\r carriage return
\t 水平制表符
\v 竖直制表符
\0NNN 用8进制表示(1 到 3 位数字)
\xHH 用十六进制表示 (1 到 2 位数字)

示例

  • 示例1

1
$ echo -e "An apple a day keeps away \a\t\tdoctor\n"

  • 示例2

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh
#
# Script that demos, command line args
#
clear
echo "hello $user"
echo -e "today is \c "; date # date 命令用于打印日期
echo -e "number of user login : \c" ; who | wc -l
echo "calendar"
cal # cal 命令用于打印日历
exit 0

打印彩色信息

要达到这个目的需要使用称为 转义序列码 (escape sequence code) 的特殊代码。

下面的命令会把命令行端口中打印一串蓝色的字符:

1
$ echo -e "\033[34m Hello Colorful World"

上面这条命令使用ANSI转义序列(\033[34m)。这条命令的执行顺序如下:

  1. 先处理 \033 转义符,用于促发紧跟着的动作;
  2. 处理 [34m 转义码,设置前景色为蓝色;
  3. 最后,终端将除了转义序列码之外的普通信息用蓝色打印出来。

在使用 echo 的同时使用转义序列码的格式为:

1
$ echo -e "\033[escape-code your-message"

在上面的示例格式中,

  1. \033 是一个转义符,用以告诉命令行端口先进入转义模式;
  2. 读入后面紧跟着的 [ 字符并进入CSI(Command Sequence Introduction)模式;
  3. 在 CSI 模式端口读入一系列 ASCII 编码的十进制数字 (作为参数) ,字符间可用分号(;)隔开;
  4. 读入动作字母/字符。

一些重要的动作字母/字符包括:

字母/字符 在CSI中的作用 示例
h 设置ANSI模式 echo -e "\033[h"
l 清除ANSI模式 echo -e "\033[l"
m 用于设置字符的颜色,以及粗体、闪烁等字体效果 echo -e "\033[35m Hello World"
q 键盘 Num LockCaps LockScroll Lock 的LED灯的开关 echo -e "\033[2q"
s 保存当前光标的 x、y 坐标(行、列位置)和属性 echo -e "\033[7s"
u 恢复光标位置和属性 echo -e "\033[8u"

m动作字符的参数列表

参数 用途 示例
0 设回默认方案
1 设置粗体 $ echo -e "I am \033[1m BOLD \033[0m Person"
2 设置灰度 $ echo -e "\033[1m BOLD \033[2m DIM \033[0m"
5 闪烁效果 $ echo -e "\033[5m Flash! \033[0m"
7 屏幕反色 $ echo -e "\033[7m Linux OS! Best OS!! \033[0m"
11 将特殊的控制字符用图形化的字符表示
25 去除闪烁效果
27 去除反色效果
30-37 设置前景色(例如 31-红色;32-绿色) $ echo -e "\033[31m I am in Red"
47-47 设置背景色 $ echo -e "\033[44m Wow!!!"

q动作字符的参数列表

参数 用途
0 关闭所有键盘上的LED灯
1 Scroll Lock的LED灯打开,其他等LED灯关闭
2 Num Lock的LED灯打开,其他LED灯关闭
3 Caps Lock的LED灯打开,其他LED灯关闭

cat

功能: 连接多个文件内容并使用标准输出打印;还可以用它来创建文件。

用法

1
$ cat [OPTION]...[FILE]...

选项说明

选项 说明
-A --show-all -vET等效
-b --number-nonblank 打印非空行的行号,覆盖-n选项
-n --number 打印行号
-e -vE等效
-E --show-ends 在每一行的行末加上$
-s --squeeze-blank 压缩重复的空行
-t -vT等效
-T --show-tabs TAB制表符打印成^I
-u (略)
-v --show-nonprinting 使用^M-标记不可打印字符(除了LFDTAB之外)
--help 打印帮助信息并退出
--version 打印版本信息并退出

利用 cat 打印或写入文件

当没有指定 FILE ,或当 FILE- 时,从标准输入里读入。因此cat除了用来打印文件中的内容之外,还常常用来从标准输入中获取内容并重定向输出到文件中。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat > sample.txt
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
# Press Ctrl+D to exit the input
$ cat -e sample.txt
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod$
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,$
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo$
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse$
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non$
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.$

tips: 还有一个和`cat`命令相反的`tac`命令,从最后一行开始打印文件内容。可以通过`$ man tac`了解更多信息。

more

功能: 用于分页打印文件内容的过滤器。

用法

1
$ more [options] file [...]

选项说明

下面只罗列最常用的几个选项:

选项 说明
-number 指定屏幕的大小为 number
+number 从第 number 行开始打印
-d 提示帮助信息
-l 避免在分页符^L处自动分页。
-f 让more统计逻辑行,而非屏幕上的物理行(例如过长的一行)。
-p 清除整页(屏幕)内容再输出文本。
-s --squeeze-blank 压缩重复的空行

命令

常用的命令有:

按键 命令
h? 帮助
SPACE 打印之后的k行内容。k默认为屏幕大小。
z 打印之后的k行内容。k默认为屏幕大小。如果带上参数,则默认的k值将被新的值取代。
RETURN 打印之后的k行内容。k默认为1。如果带上参数,则默认的k值将被新的值取代。
qQ 退出
s 前进k行,k默认为1。
f 前进k个屏幕的行数,k默认为1。
b^B 后退k行,k默认为1。注意这个命令只能用于文件,而不能用于管道。
' 跳转到上一个搜索结果的位置。
= 打印当前行号。
/pattern 查找第k个匹配正则式的位置。k默认为1。
n 查找第k个匹配上一个正则式的位置。k默认为1。
!command:!Command 在子shell里执行命令。
v 在当前行启动一个编辑器。
^L 重绘屏幕。
:n 跳转到之后的第k个文件(如果打开了多个文件的话,否则还是打开这个文件)。
:p 跳转到之前的第k个文件(如果打开了多个文件的话,否则还是打开这个文件)。
:f 显示当前文件名以及行数。
. 重复上一个命令。

h可以获取更多命令。

less

功能: 和 more 功能相近的一个快速小巧的文件查看程序,但更强大。允许前进、回退查看文件内容。

命令

less 的命令和 vi 非常相似。详见 $ man less 或在 less 里键入 h 查看帮助。

功能: 用于输出文件的起始部分。

用法

1
$ head [OPTION]... [FILE]...

选项说明

打印每个由FILE指定的开头的10行到标准输出。如果文件不止一个,则在每个文件开头同时输出带有文件名的头部信息。如果没有指定FILE,或者FILE-,则从标准输入中读入。

选项 说明
-c, --bytes=[-]k 打印每个文件开头的k个字节。或使用-c -k字符,打印从倒数k个字节。
-n, --lines=[-]k 打印每个文件开头k行,而不是默认的10行。或使用-n -k字符,打印从倒数k行。
-q, --quite, --silent 从不打印带有文件名的头部。
-v, --verbose 总是打印带有文件名的头部。
--help 打印帮助信息并退出
--version 打印版本信息并退出

k可以带有一个复合器作为前缀。例如:b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024。T, P, E, Z, Y 以此类推。

tail

功能: 用于输出文件的末尾部分。

用法

1
$ tail [OPTION]... [FILE]...

选项说明

打印每个由FILE指定的结尾的10行到标准输出。如果文件不止一个,则在每个文件开头同时输出带有文件名的头部信息。如果没有指定FILE,或者FILE-,则从标准输入中读入。

常用选项有:

选项 说明
-c, --bytes=k 打印每个文件末尾的k个字节。或使用-c +k打印每个文件从第K个字节开始到结尾的数据。
-n, --lines=k 打印每个文件末尾的k行,而不是默认的10行。或使用-n +k打印每个文件从第K行开始到结尾的数据。
-q, --quite, --silent 从不打印带有文件名的头部。
-v, --verbose 总是打印带有文件名的头部。
--help 打印帮助信息并退出
--version 打印版本信息并退出

同样,k可以带有一个复合器作为前缀。例如:b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024。T, P, E, Z, Y 以此类推。

其他选项详见$ man tail

tee

功能: 读取标准输入的数据,并将其内容输出成文件。

用法

1
$ tee [OPTION]... [FILE]...

如果 FILE 字段为 -,输入的文本将会拷贝到标准输出。

选项说明

选项 说明
-a --apend 追加到现有文件,而不是覆盖。
-i --ignore-interrputs 忽略中断信号
--help 打印帮助信息并退出
--version 打印版本信息并退出

示例

列出文本文件slayers.story的内容,同时复制3份副本,文件名称分别为ss-copy1、ss-copy2、ss-copy3:

1
$ cat slayers.story |tee ss-copy1 ss-copy2 ss-copy3

read

功能: 从标准输入获取数据并保存到变量。

用法

1
$ read variable1, variable2,...variableN

示例

1
2
3
4
5
#!/bin/bash
echo "Your first name please:"
read fname
echo "Hello $fname, Lets be friend!"

重定向

重定向符

Shell 中有三个主要的重定向符号:

  1. >’ 重定向符

用法

1
$ Linux-command > filename

输出命令 Linux-command 的结果到文件。如果文件已经存在,则该文件原来的内容将被覆盖。

  1. >>’ 重定向符

用法

1
$ Linux-command >> filename

将追加命令 Linux-command 的结果到文件的末尾。如果文件已经存在,则该文件将被打开,新的信息将被写入该文件的末尾。而如果该文件并没有存在,则新文件将被创建。

  1. <’ 重定向符

用法

1
$ Linux-command < filename

从文件读入内容,而不是从键盘输入数据。

其他用法

例1. 创建文本文件

1
2
3
4
5
6
$cat > sname
vivek
ashish
zebra
babu
Press CTRL + D to save.

例2. 从文件读入内容进行排序再写入文件

1
2
3
4
5
6
$ sort < sname > sorted_names
$ cat sorted_names
ashish
babu
vivek
zebra

例3. 读入文件,将小写字母转换为大写再保存进文件

1
2
3
4
5
6
$ tr "[a-z]" "[A-Z]" < sname > cap_names
$ cat cap_names
VIVEK
ASHISH
ZEBRA
BABU

深入了解重定向

在Linux(以及C程序语言)中,你的键盘、屏幕等都会被当做文件来看待。这些文件的名字如下表所示:

标准文件 文件描述符 作用
stdin 0 标准输入
stdout 1 标准输出
stderr 2 标准错误

你可以直接将一个文件描述符重定向到文件:

1
文件描述符>文件名

例如,可以重定向因为试图删除当前目录中不存在的文件而得到的错误信息到文件输出:

1
$ rm bad_file_name111 2>er

注意: 别忘记加上 `2`。因为 `2` 是stderr文件的文件描述符。

标准文件之间也可以重定向,格式为:

1
from>&destination

示例如下:

1
2
3
4
5
6
7
8
9
$ cat > demoscr
if [ $# -ne 2 ]
then
echo "Error : Number are not supplied" 1>&2 # 将错误信息重定向到stderr
echo "Usage : $0 number1 number2" 1>&2 # 将错误信息重定向到stderr
exit 1
fi
ans=`expr $1 + $2`
echo "Sum is $ans"

管道

功能: 管道(Pipe)是一个将一个程序的输出连接到另一个程序作为输入,而无需借助任何临时文件的方法

示意图

                                          +-------------------+
                +----------+      |       |                   |
                |          |      |       | 获得第一个命令的    |
                | 第一个命令| ---> | --->  | 输出作为这个命令的  |
                |  的输入   |      |       | 输入              |
                +----------+      |       |                   |
                                          +-------------------+

用法

1
command1 | command2

示例

1
2
3
4
5
6
$ ls | more
$ who | sort
$ who | sort > user_list
$ who | wc -l
$ ls -l | wc -l
$ ps -A | grep "emacs"

过滤器

利用管道可以创建过滤器,例如从一个文件中截取从第20行到第30行的数据:

1
$ tail +20 < hotel.txt | head -n30 >hlist