Linux 笔记 - 第十章 Shell 基础知识

博客地址:http://www.moonxy.com

一、前言

Shell 是系统的用户界面,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行。实际上 Shell 是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell 有自己的编程语言用于对命令的编辑,它允许用户编写由 shell 命令组成的程序。Shell 编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的 Shell 程序与其他应用程序具有同样的效果。

Shell 脚本命令的工作方式有两种:交互式和批处理。

交互式(Interactive):用户每输入一条命令就立刻执行。

批处理(Batch):由用户事先编写好一个完整的 Shell 命令,Shell 会一次性执行脚本中的多条命令。

二、Linux 进程管理与作业控制

进程和作业的区别与联系:

区别:进程是一个程序在一个数据集上的一次执行,而作业是用户提交给系统的一个任务。

联系:一个作业通常包括几个进程,几个进程共同完成一个任务,即作业。

用户提交作业以后,如果作业被调度,系统会为作业创建进程,一个进程无法完成时,系统会为这个进程创建子进程。

当运行进程时,可以使用 Ctrl + Z 组合键来将其暂停,然后使用 fg(foreground)命令恢复它到前台,或者利用 bg (background)命令使它到后台运行,也可以使用 Ctrl + C 组合键来结束/终止该进程

用 vi 或 vim 编辑一个 test1.txt 文件,随便输入 abc123,按 ESC 键退到一般模式,接着使用 Ctrl + Z 组合键暂停此任务,如下:

[root@ryan linux]# vi test1.txt

abc123

[root@ryan linux]# vi test1.txt

[1]+ Stopped vi test1.txt

此时显示 vi test1.txt 任务已经停止了 Stopped,前面的序号1,代表的是作业的编号,输入 jobs 命令可以列出当前的任务,如下:

[root@ryan linux]# jobs
[1]+ Stopped vi test1.txt

然后使用 fg + 编号, 可以恢复该任务,此时又会进入刚才 vi 的一般模式窗口中了,再此将其暂停,如下:

[root@ryan linux]# fg 1
vi test1.txt

[1]+ Stopped vi test1.txt

如果想将任务放在后台运行,可以使用 bg + 编号,如下:

[root@ryan linux]# bg 1
[1]+ vi test1.txt &

[1]+ Stopped vi test1.txt

此时 vi test1.txt 的状态仍然为 Stopped,表示该任务不支持在后台运行,否则应该为 Running 状态。我们换成其他的命令,如监控系统资源的命令 vmstat,vmstat 1 表示每隔一秒钟输出一次系统状态,如下:

[root@ryan linux]# vmstat 1 >/tmp/vm.log

执行之后,按 Ctrl + Z 键暂停,此时显示如下:

[root@ryan linux]# vmstat 1 >/tmp/vm.log
^Z
[2]+ Stopped vmstat 1 > /tmp/vm.log

输入 jobs 查看任务,如下:

[root@ryan linux]# jobs
[1]- Stopped vi test1.txt
[2]+ Stopped vmstat 1 > /tmp/vm.log

输入 bg + 编号,将其放入后台运行,如下:

[root@ryan linux]# bg 2
[2]+ vmstat 1 > /tmp/vm.log &

此时再使用 jobs 查看,如下:

[root@ryan linux]# jobs
[1]+ Stopped vi test1.txt
[2]- Running vmstat 1 > /tmp/vm.log &

发现第二个任务的状态变成了 Running 状态了,表示此命令在后台运行了。

注意:

放入后台运行的命令,后边会添加 & 符号,且前面有个空格。

作业编号后面的加号 + 表示该作业是默认作业,减号 - 表示该作业是下一个默认作业,即第二默认作业。

此时,如果想结束该任务,如果你还在刚才的 Shell 中(第一种情况),可以使用 fg + 编号 将任务调入前台,然后按 Ctrl + C 组合键来结束任务,如下:

[root@ryan linux]# fg 2
vmstat 1 > /tmp/vm.log
^C

当然,你可以可以使用 ps aux |grep vmstat 来找到其进程号,来强制终止进程。

另一种情况,已经关闭了刚才的 shell,再次打开另一个 shell 后,使用 jobs 命令并不会显示在后台运行或者被暂停的任务,要关闭这些任务,需要找他们的进程号 pid,如下:

[root@ryan ~]# ps aux |grep vmstat
root 1910 0.0 0.0 6260 696 pts/0 S 13:21 0:00 vmstat 1
root 1938 0.0 0.0 103308 876 pts/1 S+ 13:28 0:00 grep vmstat

此处的 1910 即为要结束的任务进程 pid,使用 kill 命令,结束该进程,如下:

[root@ryan ~]# kill 1910

如果遇到结束不掉的进程,可以添加参数 -9,即 kill -9 [pid],表示强制结束。

结束进程之后,重新查看,发现已经不存在 vmstat 1 进程了。

[root@ryan ~]# ps aux |grep vmstat
root 1944 0.0 0.0 103308 876 pts/1 S+ 13:32 0:00 grep vmstat

注意:

我们也可以直接将任务放在后台运行,如下:

[root@ryan linux]# vmstat 2 >/tmp/vm2.log &
[1] 1947

此处的 [1] 表示作业编号1,1947 表示进程号 pid。

使用 jobs 查看任务,如下:

[root@ryan linux]# jobs
[1]+ Running vmstat 2 > /tmp/vm2.log &

使用 ps aux |grep vmstat 查看进程

[root@ryan linux]# ps aux |grep vmstat
root 1947 0.0 0.0 6260 696 pts/0 S 13:40 0:00 vmstat 2
root 1949 0.0 0.0 103308 872 pts/0 S+ 13:42 0:00 grep vmstat

总结如上使用到的操作及命令:

Ctrl + Z 组合键暂停一个前台进程;

Ctrl + C 组合键终止一个前台进程;

fg - Resume jobspec in the foreground, and make it the  current  job.恢复一个作业到前台,并作为当前作业;

bg - Resume each suspended job jobspec in the background, as if it had been started with &.恢复一个作业到后台,仿佛为其添加了 & 符号;

jobs - The first form lists the active jobs. 列出活动的作业;

ps - report a snapshot of the current processes.显示一个当前进程的快照;

kill - terminate a process.结束一个进程;

要将某条命令放入后台运行,可以在其后面添加空格,然后添加 & 符号。

通常,终止一个前台进程可以使用 Ctrl+C 键,但是,对于一个后台进程就须用 kill 命令来终止,我们就需要先使用 ps/pidof/pstree/top 等工具获取进程 PID,然后使用 kill 命令来杀掉该进程。

将命令放入后台运行可将 & 与 nohup 命令配合使用:

&
当在前台运行某个作业时,终端被该作业占据;可以在命令后面加上 & 实现后台运行。例如:sh test.sh &

适合在后台运行的命令有 find、费时的排序及一些 shell 脚本。在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:

command > out.file 2>&1 &

这样,所有的标准输出和错误输出都将被重定向到一个叫做 out.file 的文件中。2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个 &, 是让该命令在后台执行。

当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。(ps -ef | grep 进程号 或者 kill -9 进程号)

nohup

使用 & 命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行。nohup 命令可以在你退出账户之后继续运行相应的进程。nohup 就是不挂起的意思(no hang up)。该命令的一般形式为:

# nohup command &

如果使用 nohup 命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为 nohup.out 的文件中,除非另外指定了输出文件:

# nohup command > myout.file 2>&1 &

使用了 nohup 之后,很多人就这样不管了,其实这样有可能在当前账户非正常退出或者结束的时候,命令还是自己结束了。所以在使用 nohup 命令后台运行命令之后,需要使用exit正常退出当前账户,这样才能保证命令一直在后台运行。

2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了 out.file 文件,即将标准出错也输出到 out.file 文件中。最后一个 &, 是让该命令在后台执行。

三、常用命令

3.1 命令 evn

env 显示当前用户的环境变量。

[root@ryan ~]# env
HOSTNAME=ryan
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.1.102 57190 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/1
USER=root
……

3.2 命令 set

set 显示当前 shell 的变量,包括当前用户的变量,系统预设的变量和用户自定义的变量。

[root@ryan ~]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=80
……

每个 shell 都有自己特有的变量,这和用户变量是不同的。当前用户变量和你用什么 shell 无关,不管你用什么 shell 都是存在的,比如 HOME,SHELL 等这些变量。但 shell 自己的变量,不同的 shell 是不同的,比如 BASH_ARGC, BASH 等,这些变量只有 set 才会显示,是 bash 特有的。

在父 shell 中设定变量后,进入子 shell 时,该变量不会继续生效,如果想让该变量在子 shell 中也生效,需要使用 export 指令,如下:

只在当前 shell 中生效:

[root@ryan linux]# myname=ryan
[root@ryan linux]# echo $myname
ryan
[root@ryan linux]# bash
[root@ryan linux]# echo $myname

[root@ryan linux]# exit
exit
[root@ryan linux]# echo $myname
ryan
[root@ryan linux]# echo ${myname}
ryan

使用 export 声明后,在其子 shell 中也生效:
[root@ryan linux]# export myname
[root@ryan linux]# echo $myname
ryan
[root@ryan linux]# bash
[root@ryan linux]# echo $myname
ryan

如果要想取消某个变量,可是使用 unset 变量名 即可,如下:

[root@ryan linux]# echo $myname
ryan
[root@ryan linux]# unset myname
[root@ryan linux]# echo $myname

但是对于上面定义变量的方式,要么只能在当前 shell 中生效,要么是只能在当前 Shell 及其子 Shell 中生效,如果要让设置设置的变量一直生效,需要将其配置到文件中,可以如下分为两种情况。

在自定义变量时,需要注意:

变量名只能由字母、数字以及下环线组成,而且不能以数字开头,等号两边不能有空格。

3.3 系统环境变量和个人环境变量的配置文件

系统环境变量的配置文件:/etc/profile,在该文件中定义的变量,运行允许系统内所有用户登录后都能使用该变量。比如可以配置 Java 环境变量到该文件中:

export JAVA_HOME=/usr/local/jdk1.8.0_144
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH

配置之后,使用命令 source /etc/profile 即可立即生效。

注意:

Windows 中环境变量的值之间使用英文分号(;)作为分隔符,而 Linux 中使用英文冒号(:)作为分隔符。

个人环境变量的配置文件:用户家目录下的 .bashrc,仅允许当前用户使用该变量,配置方式与上面一样,使用 source .bashrc,更改后立即生效。

3.4 命令 alias

alias,可以给一个常用但很长的命令取一个简单的别名,使用时,可以直接使用新的别名,但是该命令只对当前 shell 有效,如果需要一直生效,需要按照如上方式配置配置到文件中。如下:

[root@ryan linux]# alias la='ls -alt --color=auto'
[root@ryan linux]# la
total 80
drwxr-xr-x. 5 root root 4096 Mar 31 13:38 .
-rw-r--r--. 1 root root 7 Mar 31 13:38 test1.txt
dr-xr-x---. 22 root root 4096 Mar 29 22:12 ..
-rw-r--r--. 1 root root 208 Mar 21 22:24 test1.tar.xz

也可以使用: unalias 别名,来取消该别名,如下:

[root@ryan linux]# unalias la
[root@ryan linux]# la
bash: la: command not found

3.5 命令 cut

cut - remove sections from each line of files,用来截取某个字段,其格式为:cut -d '分隔符' [cf] n,n 为数字,选项说明如下:

-d:后面跟分隔符,且需要用单引号括起来;

-c:后面接的是第几个字符;

-f:后面接的是第几个区块;

使用 vi 添加一些数据,如下:

[root@ryan linux]# cat test2
bob:26:shanxi:138912
ryan:28:china:23124
adam:30:xinjiang:123123
emily:20:beijing:35345

[root@ryan linux]# cat test2|cut -d ':' -f 1
bob
ryan
adam
emily

-d 选项后面加冒号作为分隔符,-f 1 表示截取第一段,-f 和 1 之间的空格可有可无。

[root@ryan linux]# cat test2|cut -c1
b
r
a
e

-c 选项后面可以是一个数字 n,也可以是一个区间 n1-n2,也可以是多个数字 n1,n2,n3,如下:

[root@ryan linux]# cat test2|cut -c1-6
bob:26
ryan:2
adam:3
emily:
[root@ryan linux]# cat test2|cut -c1,3,4
bb:
ran
aam
eil

cut 用的比较多的功能就是上面的按分隔符拆分然后获取,如下:

[root@ryan shelltest]# ll
total 32
-rwxr-xr-x 1 root root 233 Apr 14 17:33 casetest.sh
-rw-r--r-- 1 root root 18 Apr 13 20:49 field.properties
-rwxr-xr-x 1 root root 141 Apr 14 17:40 fortest.sh
-rwxr-xr-x 1 root root 211 Apr 13 20:48 funcomp.sh
-rwxr-xr-x 1 root root 235 Apr 13 20:47 funtest.sh
-rwxr-xr-x 1 root root 321 Apr 13 20:46 iftest.sh
-rwxr-xr-x 1 root root 101 Apr 14 14:37 readtest.sh
-rwxr-xr-x 1 root root 113 Apr 13 20:46 whiletest.sh
[root@ryan shelltest]# cat field.properties
appname=usrsystem
[root@ryan shelltest]# appfile=field.properties
[root@ryan shelltest]# appname=$(grep '^app' $appfile | cut -d '=' -f2)
[root@ryan shelltest]# echo $appname
usrsystem

当然,也可以使用 awk 来实现分隔取值的功能,如下:

[root@ryan shelltest]# appfile=field.properties
[root@ryan shelltest]# appname=$(awk '/^app/' $appfile | awk -F '=' '{print $2}')
[root@ryan shelltest]# echo $appname
usrsystem

注意:awk 以空格为分割域时,是以单个或多个连续的空格为分隔符的;cut 则是以单个空格作为分隔符。

3.6 命令 sort

sort - sort lines of text files,用于排序,格式为:sort [-t 分隔符] [-kn1,n2] [-nru],这里 n1 和 n2 都是数字,选项说明如下:

-t:后面跟分隔符,作于和 cut 的 -d 选项一样;

-n:表示使用纯数字排序;

-r:表示反向排序;

-u:表示去重复;

-kn1,n2:表示由 n1 区间排序到 n2 区间,可以只写 -kn1,即对 n1 排序;

如果 sort 不加任何选项,则按照从首字符向后依次按 ASCII 码值进行比较,最后将他们按升序输出,如下:

[root@ryan linux]# cat test2
bob:26:shanxi:138912
ryan:28:china:23124
adam:30:xinjiang:123123
emily:20:beijing:35345

-t 选项后面跟分隔符,-k 选项后面跟单个数字表示对第几个区域的字符串排序,-n 选项则表示使用纯数字排序,如下:

[root@ryan linux]# sort -t: -k2 -n test2
emily:20:beijing:35345
bob:26:shanxi:138912
ryan:28:china:23124
adam:30:xinjiang:123123

-k 选项后面跟数字 n1 和 n2 表示对第 n1 到 n2 区域内的字符串排序,-r 选项表示反向排序,即降序,如下:

[root@ryan linux]# sort -t: -k2,4 -n -r test2
adam:30:xinjiang:123123
ryan:28:china:23124
bob:26:shanxi:138912
emily:20:beijing:35345

3.7 命令 wc

wc - print newline, word, character, and byte counts for each file,用于统计文档的行数,词数,字符数和比特数。常用的选项如下:

-l:统计行数;

-w:统计词数;

-m:统计字符数;

[root@ryan linux]# cat test2
bob:26:shanxi:138912
ryan:28:china:23124
adam:30:xinjiang:123123
emily:20:beijing:35345
[root@ryan linux]# wc test2
4 4 88 test2
[root@ryan linux]# wc -l test2
4 test2
[root@ryan linux]# wc -w test2
4 test2
[root@ryan linux]# wc -m test2
88 test2

wc 后面不添加选项时,则会依次输出行数、词数和字符数。

3.8 命令 uniq

uniq - report or omit repeated lines,用来删除重复行。常用 -c 选项,表示统计出重复的行数,并把行数输出到前。

先创建数据:

[root@ryan linux]# cat test3.txt
111222
aabc
aabc
aabc
aabcd
111222
abc123

但是,使用 uniq 前,需要先给文件排序,然后才能使用 uniq 去重,否则显示的重复行数可能有误。原因在于:

Note:  ’uniq’  does not detect repeated lines unless they are adjacent.  You may want to sort the input first, or use ‘sort -u’ without ‘uniq’.  Also, com-parisons honor the rules specified by ‘LC_COLLATE’.

如下:

[root@ryan linux]# uniq test3.txt
111222
aabc
aabcd
111222
abc123
[root@ryan linux]# sort test3.txt |uniq
111222
aabc
aabcd
abc123
[root@ryan linux]# sort test3.txt |uniq -c
2 111222
3 aabc
1 aabcd
1 abc123

当然也可以使用 sort -u(--unique) 来对文件去重,如下:

[root@ryan linux]# sort -u test3.txt
111222
aabc
aabcd
abc123

3.9 命令 tee

tee - read from standard input and write to standard output and files,读取标准输入到标准输出和文件。也就是说 tee 既可以将数据显示在屏幕上,也同时将数据写入到文件中。常用的选项为 -a(--append),表示追加,不加该选项则表示覆盖。

[root@ryan linux]# echo 'java softeware' |tee /tmp/tee.log
java softeware
[root@ryan linux]# cat /tmp/tee.log
java softeware

经常在编译源码包时会使用到如下命令:

make 2>&1 | tee log.txt

表示将标准错误信息重定向到 log.txt,同时也输出到屏幕。

[root@ryan linux]# vi test.sh
#!/bin/bash
t
date

以上使用 vi 创建了 test.sh 脚本,添加执行权限,如下:

[root@ryan linux]# ./test.sh
bash: ./test.sh: Permission denied
[root@ryan linux]# chmod +x test.sh

然后执行 shell 脚本,如下:

[root@ryan linux]# ./test.sh |tee /tmp/tee.log
./test.sh: line 2: t: command not found
Sat Mar 31 19:04:47 CST 2018
[root@ryan linux]# cat /tmp/tee.log
Sat Mar 31 19:04:47 CST 2018
[root@ryan linux]# ./test.sh 2>&1 |tee /tmp/tee.log
./test.sh: line 2: t: command not found
Sat Mar 31 19:06:23 CST 2018
[root@ryan linux]# cat /tmp/tee.log
./test.sh: line 2: t: command not found
Sat Mar 31 19:06:23 CST 2018

3.10 命令 tr

tr - translate or delete characters,对来自标准输入的字符进行转换、删除或替换。通常用来删除文档中出现的特殊字符,如换行符等。常用命令如下:

-d:表示删除某个字符,后面跟要删除的字符;

-s:表示删除重复的字符;

比如将小写字母转换成大写字母,如下:

[root@ryan linux]# cat test3.txt
111222
aabc
aabc
aabc
aabcd
111222
abc123
[root@ryan linux]# cat test3.txt|tr '[a-z]' '[A-Z]'
111222
AABC
AABC
AABC
AABCD
111222
ABC123

也可以替换某个字符,如下:

[root@ryan linux]# cat test3.txt
111222
aabc
aabc
aabc
aabcd
111222
abc123
[root@ryan linux]# cat test3.txt|tr 'a' 'A'
111222
AAbc
AAbc
AAbc
AAbcd
111222
Abc123

3.11 命令 split

split - split a file into pieces,用于切割文档,常用选项有 -b 和 -l,如下:

-b:表示依据大小来切割文档,单位为 byte;

[root@ryan split_dir]# ll
total 16
-rw-r--r--. 1 root root 13368 Mar 31 19:49 install.log
[root@ryan split_dir]# split -b 5k install.log
[root@ryan split_dir]# ll
total 36
-rw-r--r--. 1 root root 13368 Mar 31 19:49 install.log
-rw-r--r--. 1 root root 5120 Mar 31 19:51 xaa
-rw-r--r--. 1 root root 5120 Mar 31 19:51 xab
-rw-r--r--. 1 root root 3128 Mar 31 19:51 xac

如果不指定 split 的目标文件名,则会以 xaa、xab... 这样的文件名来存取切割后的文件,我们也可以自定义目标文件名,目标文件名将会替换掉前面的 x,如下:

[root@ryan split_dir]# rm -rf xa*
[root@ryan split_dir]# ll
total 16
-rw-r--r--. 1 root root 13368 Mar 31 19:49 install.log
[root@ryan split_dir]# split -b 5k install.log install
[root@ryan split_dir]# ll
total 36
-rw-r--r--. 1 root root 5120 Mar 31 19:54 installaa
-rw-r--r--. 1 root root 5120 Mar 31 19:54 installab
-rw-r--r--. 1 root root 3128 Mar 31 19:54 installac
-rw-r--r--. 1 root root 13368 Mar 31 19:49 install.log

-l:表示依据行数来分割文档;

[root@ryan split_dir]# wc -l install.log
342 install.log
[root@ryan split_dir]# split -l 100 install.log
[root@ryan split_dir]# ll
total 32
-rw-r--r--. 1 root root 13368 Mar 31 19:49 install.log
-rw-r--r--. 1 root root 3769 Mar 31 20:03 xaa
-rw-r--r--. 1 root root 3742 Mar 31 20:03 xab
-rw-r--r--. 1 root root 3981 Mar 31 20:03 xac
-rw-r--r--. 1 root root 1876 Mar 31 20:03 xad
[root@ryan split_dir]# wc -l *
342 install.log
100 xaa
100 xab
100 xac
42 xad
684 total

3.12 命令 paste

paste - merge lines of files,合并文件行,默认使用制表位(TABs)分隔,也可自定义合并后的分隔符。通常用于将两个含有单列数据的文件,按行合并到同一个文件中。选项 -d 后面跟自定义的分隔符

[root@ryan linux]# cat vim 11.txt
cat: vim: No such file or directory
1
2
3
4
5
[root@ryan linux]# cat 11.txt
1
2
3
4
5
[root@ryan linux]# cat 22.txt
q
w
e
r
t
y
[root@ryan linux]# paste 11.txt 22.txt
1 q
2 w
3 e
4 r
5 t
y
[root@ryan linux]# paste -d',' 11.txt 22.txt
1,q
2,w
3,e
4,r
5,t
,y

四、特殊符号

4.1 特殊符号 $

符号 $ 可以作为标识符放在变量前,表示引用这个变量;也可以与英文感叹号 ! 结合起来使用,表示上一条命令的最后一个变量,如下:

[root@ryan split_dir]# wc -l install.log
342 install.log
[root@ryan split_dir]# ll !$
ll install.log
-rw-r--r--. 1 root root 13368 Mar 31 19:49 install.log

4.2 特殊符号 ;

我们通常都是在一行输入一条命令,然后回车执行。也可以在一行输入多条命令,中间添加分隔符(;)即可,如下:

[root@ryan linux]# ll test1.txt;cat test3.txt
-rw-r--r--. 1 root root 7 Mar 31 13:38 test1.txt
111222
aabc
aabc
aabc
aabcd
111222
abc123

4.3 特殊符号 ~

符号 ~ 代表家目录,root 的家目录是 /root,普通用户的家目录是 /home/username。

4.4 特殊符号 &

如果要将一条命令放入后台运行,可以添加符号 &,如:

[root@ryan linux]# vmstat 1 >/tmp/vm.log &
[1] 2576

4.5 特殊符号 >、>>

符号 > 和 >> 都是重定向符,分别表示覆盖和追加的意思,2> 和 2>> 分别表示将标准错误信息的覆盖和追加。

Linux 中有三种标准输入输出,分别是 STDIN,STDOUT,STDERR,对应的数字是 0,1,2。STDIN 是标准输入,默认从键盘读取信息;STDOUT 是标准输出,默认将输出结果输出至终端;STDERR 是标准错误,默认将输出结果输出至终端。

4.6 特殊符号 && 和 ||

前面提到的多条命令之间的分号(;),command1;command2,不管command1 是否执行成功,command2 仍然会继续执行;

command1 && command2,只有 command1 执行成功后,command2 才会执行,否则 command2 不会执行;

command1 || command2,只要 command1 执行成功,command2 就不执行,否则 command2 执行。

符号 &&、|| 与 Java 等语言中的逻辑运算符的规则类似。

4.7 常见的通配符

* 代表零个或多个任意字符

? 只代表一个任意的字符

[] 中括号为字符组合,代表字符组合中的任意一个

[root@ryan linux]# ls -d *
1 split_dir test1.tar.bz2 test1.txt test3.txt test.sh
file.log test test1.tar.gz test1.zip test4
install.log test1 test1.tar.xz test2 test4.zip
[root@ryan linux]# ls -d test*
test test1.tar.bz2 test1.tar.xz test1.zip test3.txt test4.zip
test1 test1.tar.gz test1.txt test2 test4 test.sh
[root@ryan linux]# ls -d test?
test1 test2 test4
[root@ryan linux]# ls -d test[2-4]
test2 test4

posted on 2018-04-02 22:08  沐小悠  阅读(526)  评论(0编辑  收藏  举报