博客地址: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

Linux 笔记 - 第十章 Shell 基础知识的更多相关文章

  1. Linux shell基础知识(上)

    Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...

  2. Linux Shell 基础知识(一)

    1. 本文知识结构 2. shell 基础知识 2.1 shell 简单介绍 ​ GNU bash shell 能提供对 Linux 系统的交互式访问,一般来说,使用快捷键 Ctrl + Alt + ...

  3. Spring Cloud微服务实战阅读笔记(一) 基础知识

    本文系<Spring Cloud微服务实战>作者:翟永超,一书的阅读笔记. 一:基础知识   1:什么是微服务架构     是一种架构设计风格,主旨是将一个原本独立的系统拆分成多个小型服务 ...

  4. Linux实战教学笔记17:精简shell基础

    第十七节 精简shell基础 标签(空格分隔): Linux实战教学笔记 1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, ...

  5. bash&nbsp;shell笔记1&nbsp;脚本基础知识

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/505644 * ...

  6. 【分享】4412开发板-嵌入式Linux开发须要掌握的基础知识和技能

    本文转自迅为电子论坛:http://www.topeetboard.com 1.Linux 基础 安装Linux操作系统 Linux文件系统 Linux经常使用命令 Linux启动过程具体解释 熟悉L ...

  7. shell基础知识总结

    1. shell 对于一台计算机而言,其硬件受系统内核的控制,使用者想要控制计算机,就必须有与系统内核进行通讯的手段.而shell就是使用者与计算机进行通讯的手段之一.从命名上看,shell其实是相对 ...

  8. [Linux 001]——计算机和操作系统的基础知识

    在正式开始学习 Linux 操作系统之前,有必要先回顾/学习一下计算机和操作系统的基本知识,为我们在后续的学习中铺路搭桥,在了解计算机一些基础原理的条件下再去进行学习,理解应该会更透彻一些.我会从一个 ...

  9. shell基础知识---与监听服务器长连接端口状态

    从未写过脚本我的最近接了俩脚本的需求,就在这分享一下我的我学到基础知识主要就四部分内容 一.变量 变量的定义 string='字符串' string="字符串" num=808st ...

随机推荐

  1. ArrayList用法整理

    System.Collections.ArrayList类是一个特殊的数组.通过添加和删除元素,就可以动态改变数组的长度. 一.优点 1.支持自动改变大小的功能 2.可以灵活的插入元素 3.可以灵活的 ...

  2. Vue的冒泡事件

    由于业务需求需要,需要在一个元素中的子元素添加一个点击事件. 但是刚好父元素也有一个点击事件.这个时候我们就需要使用到Vue中的阻止事件冒泡了.

  3. Go-TCP粘包

    TCP黏包 黏包示例 服务端代码如下: // socket_stick/server/main.go func process(conn net.Conn) { defer conn.Close() ...

  4. Ubuntu安装时出现“failed to load ldlinux.c32”

    Ubuntu安装时出现“failed to load ldlinux.c32” 利用UltraISO制作了ubuntu 18.04的U盘启动,开机F12键USB启动时出现 1 2 Failed to ...

  5. Socket通信封装MIna框架--含羞代放

    目录 核心类 各个击破 IoService IoFilter IoHandler 总结 # 加入战队 微信公众号 Mina异步IO使用的Java底层JNI框架,Mina提供服务端和客户端,将我们的业务 ...

  6. Selenium+java - 手把手一起搭建一个最简单自动化测试框架

    写在前面 我们刚开始做自动化测试,可能写的代码都是基于原生写的代码,看起来特别不美观,而且感觉特别生硬. 来看下面一段代码,如下图所示: 从上面图片代码来看,具体特征如下: driver对象在测试类中 ...

  7. MVC整体运行流程一(进入管道)

    1.在浏览器输入 https://www.cnblogs.com/zhangmm96/发送一个HTTP到web服务器,Web服务器WIndows内核中的HTTP.SYS组件捕捉当前请求,该组件分析出是 ...

  8. HillCrest Sensor HAL

    1. 抽象定义 Google为Sensor提供了统一的HAL接口,不同的硬件厂商需要根据该接口来实现并完成具体的硬件抽象层,Android中Sensor的HAL接口定义在:hardware/libha ...

  9. js获取(包括中文)字符串长度与截取字符串

    /** * @param begin 截取开始的索引 * @param num 截取的长度 */ //截取字符串(包括中文) function SetString(str, len) { var st ...

  10. shell中特殊符号的作用

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...