天天看点

shell基础知识(二)

8.4 linux shell 中的特殊符号

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

# ls /etc/*.d | tail/etc/yum.repos.d:
CentOS-Base.repo
CentOS-CR.repo
CentOS-Debuginfo.repo
CentOS-fasttrack.repo
CentOS-Media.repo
CentOS-Sources.repo
CentOS-Vault.repo
epel.repo
epel-testing.repo           

?只代表一个任意的字符

# touch 1/1.txt  1/23.txt# ls 1/?.txt1/1.txt           

注释符号#

#

在linux中表示注释说明,即

#

后面的内容都会被忽略。

# a=1 #1111# echo $a1           

脱义字符\

\

会将后面的特殊符号(如

*

)还原为普通字符。

# ls 1/\\\*.txtls: 无法访问1/*.txt: 没有那个文件或目录# ls 1/\*.txt1/1.txt  1/23.txt           

管道符|

|

作用是将前面命令的输出作为后面命令的输入。

# ls /etc/\.d | tail           

命令cut

cut

命令用来截取某一个字段。

语法:cut -d 分割字符 -[cf] n(n表示数字)

  • 参数:
-d		后面跟分割字符,分割字符要用单引号括起来

-c		后面接的是第几个字符 (后面可以是数字,也可以是区间n1-n2)

-f		后面接的是第几块区块(后面与数字间的空格可有可无)           
# cat /etc/passwd | cut -d ':' -f 1 | head -5root
bin
daemon
adm
lp# cat /etc/passwd | cut -c 5 | head -2:x# cat /etc/passwd |cut -c 1,3,7 |head -2ro:
bn1           

命令sort

sort

命令用作排序。

语法:sort -t 分隔符 -kn1,n2 -nru (n1,n2代表数字)

-t		后面跟分割字符

-n		表示使用纯数字排序

-r		表示反向排序

-u		表示去重复

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

如果

sort

不加任何选项,则从首字符向后依次按ASCII码值进行比较,最后将它们按升序输出。

# head -n5 /etc/passwd | sortadm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
root:x:0:0:root:/root:/bin/bash# head -n5 /etc/passwd | sort -k3,5 -rroot:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin           

命令wc

wc

命令用于统计文档的行数、字符数或词数(默认会统计换行符)。

-l		统计行数  
-m		统计字符数  
-w		统计词数  
-L		不统计换行符           

wc

不加任何参数,直接跟文档,则会把行数、词数和字符数依次输出。

# cat 1/1.txtabc=123 #aaaa\# wc 1/1.txt
 2  3 16 1/1.txt# wc -L 1/1.txt   13 1/1.txt           

命令uniq

uniq

命令用来删除重复的行。

-c 表示统计重复的行数,并把重复行的次数写在前面

使用

uniq

之前,必须先给文件排序,否则不起作用。

# cat 1/1.txt111
222
111
333
333# uniq 1/1.txt111
222
111
333# sort 1/1.txt | uniq111
222
333# sort 1/1.txt | uniq -c
      2 111
      1 222
      2 333           

命令tee

tee

命令后面跟文件名,作用类似于重定向

>

,同时显示在屏幕上。常用于管道符

|

后面。

# echo "111111" | tee 1/1.txt111111# cat 1/1.txt111111           

命令tr

tr

命令用于替换字符,常用来处理文档中出现的特殊字符。常用于把小写字母变成大写字母,如

tr '[a-z]' '[A-Z]'

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

-s		表示删除重复的字符           
# head -2 /etc/passwd | tr '[a-z]' '[A-Z]'ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN           

命令split

split

命令用于切割文档。

-b		表示根据大小来分割文档,单位为byte

-l		表示根据行数来分割文档           

split

不指定目标文件名,则会以xaa、xab这样的文件名来存取切割后的文档,也可以自己指定文件名。

特殊符号

  • 符号

    $

$

可以用作变量前面的标识符,与

!

组合为

!$

,表示上一条命令中的最后一个变量。

# cat 1/1.txt  111111  

# ls !$ls 1/1.txt  
1/1.txt           
  • ;

在两条命令之间加上符号

;

可以在一行中运行多个命令。

# cd 1/ ;cat 1.txt  111111           
  • ~

~

表示用户的家目录,root用户的家目录是

/root

,普通用户则是

/home/username

  • &

在命令后面加上符号

&

,可以把命令放到后台运行。

  • 中括号

    []

[]

内为字符组合,代表字符组合中的任意一个,可以是一个范围(0-9,a-z)。

  • &&

    ||

command1; command2 		使用 ; 时,不管command1是否执行成功,都会执行command2

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

command1 || command2 	使用 || 时,command1执行成功后则command2不执行,否则执行command2           

命令read

read

命令后面跟的是变量名,可以是1个,也可以是多个,用空格分隔。回车后,输入的字符就是在给这些变量赋值,输入的字符串也需要用空格分隔,一一对应。

# read a b c1 2 3# echo $a1# echo $b2# echo $c3           

fork, exec, source

  • fork, exec, source的区别:
  1. fork ( /directory/script.sh) :如果shell中包含执行命令,那么子命令并不影响父级的命令,在子命令执行完后再执行父级命令。子级的环境变量不会影响到父级。

    fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本。

    运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。

    sub-shell执行完毕后返回parent-shell。sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell

  2. exec (exec /directory/script.sh):执行子级的命令后,不再执行父级命令。

    exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本。被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别

  3. source (source /directory/script.sh):执行子级命令后继续执行父级命令,同时子级设置的环境变量会影响到父级的环境变量。

    与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用

相关资料: fork, exec, source的区别

继续阅读