您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页shell脚本和常用命令

shell脚本和常用命令

来源:化拓教育网
shell脚本和常⽤命令

什么是脚本?

脚本简单地说就是⼀条条的⽂字命令(⼀些指令的堆积),这些⽂字命令是可以看到的(如可以⽤记事本打开查看、编辑)。

常见的脚本: JavaScript(JS,前端),VBScript, ASP,JSP,PHP(后端),SQL(数据库操作语⾔),Perl,Shell,python,Ruby,JavaFX, Lua等。

为什么要学习和使⽤shell?Shell属于内置的脚本

程序开发的效率⾮常⾼,依赖于功能强⼤的命令可以迅速地完成开发任务(批处理)语法简单,代码写起来⽐较轻松,简单易学

1.1 Shell 简介

Shell 是⼀个 C 语⾔编写的脚本语⾔,它是⽤户与 Linux 的桥梁,⽤户输⼊命令交给 Shell 处理, Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出给⽤户。

下⾯是流程⽰意图:

Shell 既然是⼯作在 Linux 内核之上,那我们也有必要了解下 Linux 相关知识。 Linux 是⼀套免费试⽤和⾃由传播的类 Unix 操作系统,是⼀个基于 POSIX 和 UNIX 的多⽤户、多任 务、⽀持多线程和多 CPU 的操作系统。

1.2 Shell 分类

1.2.1 图形界⾯ Shell(GUI Shell)

GUI 为 Unix 或者类 Unix 操作系统构造⼀个功能完善、操作简单以及界⾯友好的桌⾯环境。主流桌 ⾯环境有 KDE,Gnome 等。

1.2.2 命令⾏界⾯ Shell(CLI Shell)

CLI 是在⽤户提⽰符下键⼊可执⾏指令的界⾯,⽤户通过键盘输⼊指令,完成⼀系列操作。 在 Linux 系统上主流的 CLI 实现是 Bash,是许多 Linux 发⾏版默认的 Shell。还有许多 Unix 上 Shell,例如 tcsh、csh、ash、bsh、ksh 等。

1.3 查看shell

Shell 是⼀个程序,⼀般都是放在/bin或者/user/bin⽬录下,当前 Linux 系统可⽤的 Shell 都记录在/etc/shells⽂件中。/etc/shells是⼀个纯⽂本⽂件,你可以在图形界⾯下打开它,也可以使⽤ cat 命令查看它。通过 cat 命令来查看当前 Linux 系统的可⽤ Shell:$ cat /etc/shells/bin/sh/bin/bash/sbin/nologin/usr/bin/sh/usr/bin/bash/usr/sbin/nologin/bin/tcsh/bin/csh

在现代的 Linux 上,sh 已经被 bash 代替,/bin/sh往往是指向/bin/bash的符号链接。

如果你希望查看当前 Linux 的默认 Shell,那么可以输出 SHELL 环境变量: echo $SHELL/bin/bash

输出结果表明默认的 Shell 是 bash。

SHELL是 Linux 系统中的环境变量,它指明了当前使⽤的 Shell 程序的位置,也就是使⽤的哪个 Shell。

1.4 第⼀个 Shell 脚本

主要讲解在⼤多 Linux 发⾏版下默认 Bash Shell。Linux 系统是 RedHat 下的 CentOS 操作系 统,完全免费。与其商业版 RHEL(Red HatEnterprise Linux)出⾃同样的源代码,不同的是 CentOS 并不包含封闭源代码软件和售后⽀持。 ⽤ vim 打开 test.sh,编写:

# vim test.sh #!/bin/bash

echo \"Hello world!\"

第⼀⾏指定解释器,第⼆⾏打印 Hello world! 写好后,开始执⾏,执⾏ Shell 脚本有三种⽅法:

⽅法 1:直接⽤ bash 解释器执⾏# bash test.shHello world!

当前终端会新⽣成⼀个⼦ bash 去执⾏脚本。

⽅法 2:添加可执⾏权限 # ls -lh test.sh

test.sh -rw-r--r--. 1 root root 32 Aug 18 01:07 test.sh # chmod +x test.sh # ./test.sh

-bash: ./test.sh: Permission denied# chmod +x test.sh# ./test.shHello world!

这种⽅式默认根据脚本第⼀⾏指定的解释器处理,如果没写以当前默认 Shell 解释器执⾏。

注意,这⾥在运⾏时⼀定要写成 ./test.sh(绝对路径亦可),⽽不是 test.sh,运⾏其它⼆进制的程序也⼀样,直接写 test.sh,Linux 系统会去 PATH(环境变量) ⾥寻找有没有叫 test.sh 的,⽽只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH ⾥,你的当前⽬录通常不在 PATH⾥,所以写成 test.sh 是会找不到命令的,要⽤ ./test.sh 告诉系统说,就在当前⽬录找。

⽅法 3:source 命令执⾏,以当前默认 Shell 解释器执⾏# source test.shHello world!

source filename 与 bash filename 及./filename执⾏脚本的区别:

  当shell脚本具有可执⾏权限时,⽤bash filename与./filename执⾏脚本是没有区别得。./filename是因为当前⽬录没有在PATH中,所以”.”是⽤来表⽰当前⽬录的。

  source filename:这个命令其实只是简单地读取脚本⾥⾯的语句依次在当前shell⾥⾯执⾏,没有建⽴新的⼦shell。那么脚本⾥⾯所有新建、改变变量的语句都会保存在当前shell⾥⾯。

bash filename 重新建⽴⼀个⼦shell,在⼦shell中执⾏脚本⾥⾯的语句,该⼦shell继承⽗shell的环境变量,但⼦shell新建的、改变的变量不会被带回⽗shell

(即:⼦shell新建变量,在⽗shell中不会⽣效)

我们可以使⽤命令pstree查看我们当前所处的位置 需要下载

[root@lee~]# yum search pstreeLoaded plugins: fastestmirror

Loading mirror speeds from cached hostfile

==================================================== Matched: pstree ====================================================psmisc.x86_ : Utilities for managing processes on your systemtexlive-pst-tree.noarch : Trees, using pstricks[root@lee ~]# yum install psmisc -y

使⽤pstree

我们再次执⾏bash,就会进⼊到另外⼀个⼦shell中

这个时候我们在这个⼦shell中定义⼀个变量,发现可以正确打印出来

[root@ken ~]# age=25[root@ken ~]# echo $age25

现在我们退出当前的shell,即进⼊了当前⼦shell中的⽗shell中,再次打印我们刚才定义的变量

可以发现现在已经⽆法获取到我们刚才定义的变量值

⼦shell继承⽗shell的环境变量:

我们把环境变量定义到profile的⼀个⼦⽂件中,并使⽤source执⾏该⽂件并⽣效打开⼀个⼦shell,定义在⽗shell中的环境变量依然有效反之,这种操作在⼦shell中操作,⽗shell也不能继承

[root@ken ~]# cat /etc/profile.d/ken.shexport name=ken

[root@ken ~]# source /etc/profile.d/ken.sh[root@ken ~]# echo $nameken

[root@ken ~]# bash

[root@ken ~]# echo $nameken

1.5 shell编程⼏个常⽤命令

grep命令详解:过滤来⾃⼀个⽂件或标准输⼊匹配模式内容。除了 grep 外,还有 egrep。egrep 是 grep 的扩展,相当于 grep -E。Usage: grep [OPTION]... PATTERN [FILE]...

grep常⽤选项详解 选项

-E,--extended-regexp -i,--ignore-case -n,--line-number -o,--only-matching -c,--count

-B,--before-context=NUM -A,--after-context=NUM-C,--context=NUM--color[=WHEN],-v,--invert-match

描述

模式是扩展正则表达式(ERE) 忽略⼤⼩写打印⾏号

只打印匹配的内容只打印每个⽂件匹配的⾏数打印匹配的前⼏⾏打印匹配的后⼏⾏打印匹配的前后⼏⾏ 匹配的字体颜⾊ 打印不匹配的⾏

-v,--invert-match

[root@ken ~]# echo \"this is ken THIS IS KEN\" | grep -i 'ken'this is ken THIS IS KEN

[root@ken ~]# echo \"this is ken THIS IS KEN\" | grep 'ken'this is ken THIS IS KEN

2. -n,打印⾏号

[root@ken ~]# grep -n 'root' /etc/passwd1:root:x:0:0:root:/root:/bin/bash

10:operator:x:11:0:operator:/root:/sbin/nologin

3. -o,只打印匹配的内容

[root@ken ~]# echo \"this is ken THIS IS KEN\" | grep -o 'ken'ken

[root@ken ~]# echo \"this is ken THIS IS KEN\" | grep 'ken'this is ken THIS IS KEN

4. -c,打印⽂件匹配的⾏数

[root@ken ~]# grep -c 'root' /etc/passwd2

[root@ken ~]# grep 'root' /etc/passwdroot:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

5. -B,打印匹配的前⼏⾏

[root@ken ~]# grep -B 3 'root' /etc/passwdroot:x:0:0:root:/root:/bin/bash--shutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologin6.-A,打印匹配的后⼏⾏

[root@ken ~]# grep -A 3 'root' /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologin--operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologin7.-C,打印匹配的前后⼏⾏

[root@ken ~]# grep -C 3 'root' /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologin--shutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologin

打印不匹配的⾏

8. --color,在centos7中已经默认为 grep --color,在centos6中需要加上--color才会显⽰颜⾊[root@ken ~]# alias grep alias grep='grep --color=auto'

9. -v, 打印不匹配的⾏

[root@ken ~]# echo -e \"hi\\nthis is ken\\nncie to meet you\\nbye \" | grep -v 'ken'

hi

ncie to meet youbye

⼀、cut命令 语法cut [-bn] [file]cut [-c] [file]cut [-df] [file]使⽤说明:

cut 命令从⽂件的每⼀⾏剪切字节、字符和字段并将这些字节、字符和字段写⾄标准输出。如果不指定 File 参数,cut 命令将读取标准输⼊。必须指定 -b、-c 或 -f 标志之⼀。 常⽤参数:

-c :以字符为单位进⾏分割。-d :⾃定义分隔符。

-f :与-d⼀起使⽤,指定显⽰哪个区域。

常⽤实例演⽰1: -c:以字符为单位进⾏分隔[root@ken ~]# echo \"this is ken\" | cut -c 4s

[root@ken ~]# echo \"this is ken\" | cut -c 5

[root@ken ~]# echo \"this is ken\" | cut -c 2h

[root@ken ~]# echo \"this is ken\" | cut -c 1-5 this

常⽤实例演⽰2:-d,-f:⾃定义分隔符并进⾏指定显⽰

1.从标准输⼊读取

[root@ken ~]# echo 'this is ken' | cut -d' ' -f3ken

[root@ken ~]# echo \"name:ken age:25 gender:male\" | cut -d ' ' -f2 age:25

2.从⽂件中读取

[root@ken ~]# echo \"this is ken\">test[root@ken ~]# cut -d' ' -f3 testken

⼆、sort命令

Linux sort命令⽤于将⽂本⽂件内容加以排序。sort可针对⽂本⽂件的内容,以⾏为单位来排序。 语法:

sort [-bcdfimMnr][-o<输出⽂件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][⽂件]

常⽤参数说明:

-k:根据切割后的那⼀段进⾏排序

-n 依照数值的⼤⼩排序(默认是根据字符进⾏排序)。

-r 以相反的顺序来排序。

-t<分隔字符> 指定排序时所⽤的栏位分隔字符。

-u:去除重复的⾏(只要那个指定的字段重复,就认定是重复的⾏)

实例⼀:默认排序

在使⽤sort命令以默认的式对⽂件的⾏进⾏排序,使⽤的命令如下:

[root@ken ~]# cat test6 this is ken2 this is ken5 this is ken6 this is ken1 this is ken8 this is ken

[root@ken ~]# sort test1 this is ken2 this is ken5 this is ken6 this is ken6 this is ken8 this is ken

sort 命令将以默认的⽅式将⽂本⽂件的第⼀列以ASCII 码的次序排列,并将结果输出到标准输出。

实例⼆:取出排名前三

[root@ken ~]# sort -r test | head -38 this is ken6 this is ken6 this is ken

实例三:对⽂件中的内容按照e分割第⼆部分进⾏排序复制代码

[root@ken ~]# sort -t 'e' -k 2 test6 this:is:ke15 this:is:ke26 this:is:ke32 this:is:ke41 this:is:ke68 this:is:ke7

[root@ken ~]# sort -t 'e' -k 2 -r test8 this:is:ke71 this:is:ke62 this:is:ke46 this:is:ke35 this:is:ke26 this:is:ke1

实例四:去除重复的⾏

[root@ken ~]# sort test1 this:is:ke62 this:is:ke42 this:is:ke42 this:is:ke42 this:is:ke45 this:is:ke26 this:is:ke16 this:is:ke38 this:is:ke7

[root@ken ~]# sort -u test1 this:is:ke62 this:is:ke45 this:is:ke26 this:is:ke16 this:is:ke38 this:is:ke7 三、uniq命令作⽤:

去除重复的⾏(相邻且相同,认定为重复) 选项:

-c:在⾏⾸⽤数字表⽰该⾏出现了多少次-u:仅仅显⽰那些没有出现重复过的⾏

实例⼀:统计⾏数[root@ken ~]# uniq -c test 1 6 this:is:ke3 4 2 this:is:ke4 1 5 this:is:ke2 1 6 this:is:ke1 1 1 this:is:ke6 1 8 this:is:ke7

实例⼆:将⽂件中相同的⾏去重[root@ken ~]# sort test | uniq1 this:is:ke62 this:is:ke45 this:is:ke26 this:is:ke16 this:is:ke38 this:is:ke7

四、seq命令作⽤:

⽣成⼀个数组序列 格式:

seq [start [step]] stop 实例:

[root@ken ~]# seq 5 #终⽌位512345

[root@ken ~]# seq 2 5 #起始位2,终⽌位52345

[root@ken ~]# seq 2 2 10 #起始位2,步长为2,终⽌位10246810

五、tr命令 作⽤:

Linux tr 命令⽤于转换或删除⽂件中的字符。

tr 指令从标准输⼊设备读取数据,经过字符串转译后,将结果输出到标准输出设备。a-z 任意⼩写A-Z 任意⼤写0-9 任意数字

[root@ken ~]# echo \"this is ken\" | tr a-z A-ZTHIS IS KEN

[root@ken ~]# echo \"THIS IS KEN\" | tr A-Z a-zthis is ken

实例⼆:删除特定字符串s这个字符串都会被删掉[root@ken ~]# cat test6 this:is:ke32 this:is:ke42 this:is:ke42 this:is:ke42 this:is:ke45 this:is:ke26 this:is:ke11 this:is:ke68 this:is:ke7

[root@ken ~]# cat test | tr -d 's'6 thi:i:ke32 thi:i:ke42 thi:i:ke42 thi:i:ke42 thi:i:ke45 thi:i:ke26 thi:i:ke11 thi:i:ke68 thi:i:ke7

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务