Shell简介
Posted ajunyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell简介相关的知识,希望对你有一定的参考价值。
1. 前言
1.1 脚本
脚本简单地说就是一条条的文字命令(一些指令的堆积),这些文字命令是可以看到的(如可以用记事本打开查看、编辑)。
常见的脚本: JavaScript(JS,前端),VBScript, ASP,JSP,PHP(后端),SQL(数据库操作语言),Perl,Shell,python,Ruby,JavaFX, Lua等。
1.2 Shell特点
Shell属于内置的脚本。
程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理)。
语法简单,代码写起来比较轻松,简单易学。
2. Shell简介
Shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理, Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。
Shell 既然是工作在 Linux 内核之上,那我们也有必要了解下 Linux 相关知识。 Linux 是一套免费试用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任 务、支持多线程和多 CPU 的操作系统。
1983 年 9 月 27 日,Richard Stallman(理查德-马修-斯托曼)发起 GNU 计划,它的目标是创建一 套完全自由的操作系统。为保证 GNU 软件可以自由的使用、复制、修改和发布,所有的 GNU 软件都 有一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款,GNU 通用公共许可 证(GNU General Plubic License,GPL),说白了就是不能做商业用途。
GNU 是"GNU is Not Unix"的递归缩写。UNIX 是一种广泛使用的商业操作系统的名称。
1985 年,Richard Stallman 又创立了自由软件基金会(Free Software Foundation,FSF)来为 GNU 计划提供技术、法律以及财政支持。
1990 年,GNU 计划开发主要项目有 Emacs(文本编辑器)、GCC(GNU Compiler Collection,GNU 编 译器集合)、Bash 等,GCC 是一套 GNU 开发的编程语言编译器。还有开发一些 UNIX 系统的程序库和 工具。
1991 年,Linuxs Torvalds(林纳斯- 托瓦兹)开发出了与 UNIX 兼容的 Linux 操作系统内核并在 GPL 条款下发布。
1992 年,Linux 与其他 GUN 软件结合,完全自由的 GUN/Linux 操作系统正式诞生,简称 Linux。
1995 年 1 月,Bob Young 创办 ACC 公司,以 GNU/Linux 为核心,开发出了 RedHat Linux 商业版。
Linux 基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。
与 Unix 思想十分相近。 Kernel Shell 命令 用户 解析命令 并传递给内核 执行动作。
3.Shell分类
1> 图形界面Shell(GUI Shell)
GUI 为 Unix 或者类 Unix 操作系统构造一个功能完善、操作简单以及界面友好的桌面环境。主流桌 面环境有 KDE,Gnome 等。
2> 命令行界面Shell(CTL Shell)
CLI 是在用户提示符下键入可执行指令的界面,用户通过键盘输入指令,完成一系列操作。 在 Linux 系统上主流的 CLI 实现是 Bash,是许多 Linux 发行版默认的 Shell。还有许多 Unix 上 Shell,例如 tcsh、csh、ash、bsh、ksh 等。
4. 查看Shell
Shell 是一个程序,一般都是放在/bin或者/user/bin目录下,当前 Linux 系统可用的 Shell 都记录在/etc/shells文件中。/etc/shells是一个纯文本文件,你可以在图形界面下打开它,也可以使用 cat 命令查看它。
在现代的 Linux 上,sh 已经被 bash 代替,/bin/sh往往是指向/bin/bash的符号链接。
如果你希望查看当前 Linux 的默认 Shell,那么可以输出 SHELL 环境变量:
[[email protected] ~]# echo $SHELL /bin/bash
[[email protected] ~]# ll `which sh` lrwxrwxrwx. 1 root root 4 Apr 15 22:06 /usr/bin/sh -> bash #就是一个软链接
5. 第一个shell脚本
1> 脚本文件命名做到见名知意;
2> 脚本文件后缀规范来写加上.sh。
Hello World!
[[email protected] ~]# vim hello_w.sh #!/bin/bash #指定解释器,固定格式 echo "Hello World" #打印 ;wq
5.1 shell脚本的执行有三种方法
1)bash解释器
[[email protected] ~]# bash hello_w.sh Hello World
2)添加执行权限
[[email protected] ~]# ll hello_w.sh -rw-r--r--. 1 root root 32 Apr 25 20:32 hello_w.sh [[email protected] ~]# chmod -R a+x hello_w.sh [[email protected] ~]# ll -r-xr-xr-x. 1 root root 32 Apr 25 20:32 hello_w.sh [[email protected] ~]# ./hello_w.sh #当前目录启动 Hello World
3)source命令
[[email protected] ~]# source hello_w.sh Hello World
5.2 bash filename、./filename和source的区别
1)当shell脚本具有可执行权限时,用bash filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所以”.”是用来表示当前目录的。
2)source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
3)bash filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell。
子shell新建变量,在父shell中不会生效;子shell继承父shell的环境变量。
5.3 子shell与父shell
利用pstree查看当前所处位置
[[email protected] ~]# yum search pstress [[email protected] ~]# yum install psmisc -y #安装pstree [[email protected] ~]# pstree systemd─┬─NetworkManager───2*[{NetworkManager}] ├─agetty ├─auditd───{auditd} ├─crond ├─dbus-daemon───{dbus-daemon} ├─firewalld───{firewalld} ├─gssproxy───5*[{gssproxy}] ├─lvmetad ├─master─┬─pickup │ └─qmgr ├─polkitd───5*[{polkitd}] ├─rsyslogd───2*[{rsyslogd}] ├─sshd─┬─sshd───bash───su───bash───su───bash───su───bash───su───bash │ ├─2*[sshd───bash] │ └─sshd───bash───pstree ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tuned───4*[{tuned}] └─vmtoolsd───{vmtoolsd} #再次执行bash进入另一个shell中(子shell) [[email protected] ~]# bash [[email protected] ~]# pstree ├─sshd─┬─sshd───bash───su───bash───su───bash───su───bash───su───bash │ ├─2*[sshd───bash] │ └─sshd───bash───bash───pstree #在子shell中定义变量,可以打印出来 [[email protected] ~]# age=24 [[email protected] ~]# echo $age 24 #退出当前shell,进入父shell,再次打印,无法获取 [[email protected] ~]# echo $age #子shell新建变量,在父shell中不会生效 [[email protected] ~]#
5.4 shell练习
1)使用root用户帐号创建并执行test2.sh,实现创建一个shelltest用户,并在其家目录中新建文件try.html。
#!/bin/bash useradd shelltest touch /home/shelltest/try.html ;wq [[email protected] ~]# bash test2.sh [[email protected] ~]# su - shelltest Last login: Thu Apr 25 18:29:35 CST 2019 on pts/0 [[email protected] ~]$ ls try.html
2)统计当前系统总共有多少用户
[[email protected] ~]# vim count_pd.sh #!/bin/bash cat /etc/passwd | wc -l :wq [[email protected] ~]# bash count_pd.sh 29
3)统计当前已经安装的软件数量
[[email protected] ~]# vim installed.sh #!/bin/bash rpm -qa | wc -l :wq [[email protected] ~]# bash installed.sh 462
6. shell编程的几个常用命令
6.1 grep
作用:过滤来自一个文件或标准输入匹配模式内容,
格式:grep option
-E,--extended-regexp |
模式是扩展正则表达式(ERE) |
-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 |
取反,打印不匹配的行 |
-i,忽略大小写
[[email protected] ~]# echo "this is ZXJ" | grep ‘zxj‘ [[email protected] ~]# echo "this is ZXJ" | grep -i ‘zxj‘ this is ZXJ
-n,打印行号
[[email protected] ~]# grep -n ‘root‘ /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin
-o,只打印匹配的内容
[[email protected] ~]# grep -o ‘root‘ /etc/passwd root root root root
-c,打印文件匹配的行数
[[email protected] ~]# grep -c ‘root‘ /etc/passwd 2
-C,打印匹配的前后几行
[[email protected] ~]# grep -C 3 ‘root‘ /etc/passwd shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin
-B,打印匹配的前几行
[[email protected] ~]# grep -B 3 ‘root‘ /etc/passwd shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
-A,打印匹配的后几行
[[email protected] ~]# grep -A 3 ‘root‘ /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
-v,打印不匹配的行
[[email protected] ~]# echo -e "hello world\\nnice to me you\\nwelcome to my garden" | grep -v ‘nice‘ hello world welcome to my garden
6.2 cut
作用:cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
格式:
cut [-bn] [file]
cut [-c] [file]
cut [-df] [file]
参数:
-c :以字符为单位进行分割。
-d :自定义分隔符,指定分隔符,指定单个字符串。
-f :与-d一起使用,指定显示哪个区域。
从标准输入读取
[[email protected] ~]# echo ‘this is zxj‘ | cut -d‘ ‘ -f3 zxj #自定义分割:以空格分割的第三块区域为zxj
从文件中读取
[[email protected] ~]# cat /etc/passwd | cut -d‘:‘ -f1 #以:分割的第一块区域 root bin daemon adm lp ………..
6.3 sort
作用:Linux sort命令用于将文本文件内容加以排序。sort可针对文本文件的内容,以行为单位来排序。
格式:sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]
参数:
-k:根据切割后的那一段进行排序
-n:依照数值的大小排序(默认是根据字符进行排序)。
-r:以相反的顺序来排序。
-t<分隔字符> 指定排序时所用的栏位分隔字符。
-u:去除重复的行(只要那个指定的字段重复,就认定是重复的行)
1)默认排序,字符串形式筛选
[[email protected] ~]# vim test 2:123:1212 23:29:86 118:7574:85 :wq [[email protected] ~]# sort test 118:7574:85 2:123:1212 23:29:86
2)-n,依照数值的大小排序(ASCLL码)
[[email protected] ~]# sort -n test 2:123:1212 23:29:86 118:7574:85
3)-r,以相反的顺序来排序
[[email protected] ~]# sort -r test 23:29:86 2:123:1212 118:7574:85
4)-t,指定排序时用得分隔符
[[email protected] ~]# sort -t ‘:‘ -k 2 test #以:分割的第二部分排序(字符串) 2:123:1212 23:29:86 23:29:86 23:29:86 23:29:86 23:29:86 23:29:86 23:29:86 23:29:86 118:7574:85 118:7574:85 118:7574:85 118:7574:85 118:7574:85
5)-u,去除重复行
[[email protected] ~]# sort -u test 118:7574:85 2:123:1212 23:29:86 [[email protected] ~]#
6.4 uniq
作用:去除重复的行(相邻且相同,认定为重复)
选项:
-c:在行首用数字表示该行出现了多少次
-u:仅仅显示那些没有出现重复过的行
统计行数:
[[email protected] ~]# uniq -c test 1 2:123:1212 #出现1次 4 118:7574:85 #出现4次 1 23:29:86 1 118:7574:85 7 23:29:86 #出现7次
去除重复行
[[email protected] ~]# sort -n test | uniq # 与 uniq -u效果相同 2:123:1212 23:29:86 118:7574:85
6.5 seq
作用:生成一个数组序列
格式:seq start step end
[[email protected] ~]# seq 5 #终止位5 1 2 3 4 5 [[email protected] ~]# seq 2 5 #起始位为2,终止位5 2 3 4 5 [[email protected] ~]# seq 2 2 10 #起始位2,步长2,终止位10 2 4 6 8 10
6.6 tr
作用:Linux tr 命令用于转换或删除文件中的字符。tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。
a-z: 任意小写
A-Z:任意大写
0-9: 任意数字
-d: 删除
替换大写
[[email protected] ~]# echo "this is zxj"| tr a-z A-Z THIS IS ZXJ
7. 实例
7.1 批量创建用户并分配随机加密的密码
[[email protected] ~]# echo $RANDOM #生成随机数 17721 [[email protected] ~]# echo $RANDOM | md5sum #加密 4fa88b13f9a196f616f5bf91db216bc9 341542 [[email protected] ~]# echo $RANDOM | md5sum | cut -c 1-6 31a67d
#字符分割,获取6位随机加密的数,1-6表示取6位,仅1表示取第一位,仅6表示取第六位 [[email protected] ~]# vim create_user.sh #!/bin/bash for i in {1..5} do useradd user$i #创建5个用户 pass=`echo $RANDOM | md5sum | cut -c 1-6` #分配6位随机密码 echo $pass | passwd --stdin user$i echo -e "账号:user$i \\n密码:$pass \\n" >> count1 done :wq [[email protected] ~]# bash create_user.sh [[email protected] ~]# cat count1 账号:user1 密码:68b329 账号:user2 密码:68b329 账号:user3 密码:68b329 账号:user4 密码:68b329 账号:user5 密码:68b329 [[email protected] ~]# su - user1 [[email protected] ~]$ ls [[email protected] ~]$ su - user2 Password: [[email protected] ~]$ exit logout [[email protected] ~]$ exit logout [[email protected] ~]#
7.2 从网卡中取出本机ip
#方法一:
[[email protected] ~]# ip a 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:50:56:31:9b:19 brd ff:ff:ff:ff:ff:ff inet 192.168.16.4/24 brd 192.168.16.255 scope global ens33 [[email protected] ~]# ip a | grep global #取出一行 inet 192.168.16.4/24 brd 192.168.16.255 scope global ens33 [[email protected] ~]# ip a | grep global | cut -d‘/‘ -f1 #拿到 / 之前 inet 192.168.16.4 [[email protected] ~]# ip a | grep global | cut -d‘/‘ -f1 | cut -d‘t‘ -f2 #拿到ip,前有空格 192.168.16.4 [[email protected] ~]# ip a | grep global | cut -d‘/‘ -f1 | cut -d‘t‘ -f2 | tr -d ‘ ‘ #删除空格 192.168.16.4 #方法二: [[email protected] ~]# ip a | grep global | tr -d a-z | cut -d‘/‘ -f1 | tr -d ‘ ‘ 192.168.16.4 #方法三: [[email protected] ~]# ip a | grep global | cut -d‘b‘ -f1 | tr -d a-z | cut -d‘/‘ -f1 | tr -d ‘ ‘ 192.168.16.4 #方法四: [[email protected] ~]# ip a | grep global | cut -d‘t‘ -f2 | cut -d‘b‘ -f1 | cut -d‘/‘ -f1 | tr -d ‘ ‘ 192.168.16.4
7.3 test文件
需求1. 统计出各个网址出现的次数
需求2. 按照出现次数排序(升序)
需求3. 取出出现次数排名前两名的网址[[email protected] ~]# vim test
http://www.baidu.com http://www.baidu.com http://www.sina.com http://www.sina.com http://www.sina.com http://www.sina.com http://www.sina.com http://www.sina.com http://www.sina.com http://www.sina.com http://www.sina.com http://www.sina.com http://www.sina.com http://www.sina.com http://www.baidu.com http://www.baidu.com http://www.baidu.com http://www.qq.com http://www.qq.com http://www.qq.com http://www.qq.com http://www.qq.com http://www.qq.com http://www.qq.com http://www.baidu.com http://www.baidu.com http://www.baidu.com http://www.baidu.com http://www.baidu.com http://www.baidu.com http://www.taobao.com http://www.taobao.com http://www.taobao.com http://www.taobao.com http://www.taobao.com http://www.taobao.com http://www.taobao.com http://www.taobao.com http://www.taobao.com http://www.taobao.com http://www.baidu.com http://www.baidu.com http://www.baidu.com http://www.baidu.com http://www.baidu.com http://www.baidu.com http://www.baidu.com http://www.baidu.com [[email protected] ~]# cat test | cut -d"/" -f3 | sort | uniq -c #统计网站出现次数 19 www.baidu.com 7 www.qq.com 12 www.sina.com 10 www.taobao.com 7 www.qq.com [[email protected] ~]# cat test | cut -d"/" -f3 | sort | uniq -c | sort -n
#按出现次数排序 7 www.qq.com 10 www.taobao.com 12 www.sina.com 19 www.baidu.com [[email protected] ~]# cat test | cut -d"/" -f3 | sort | uniq -c | sort -n -r | head -2 #取出排名前两名的网址 19 www.baidu.com 12 www.sina.com
以上是关于Shell简介的主要内容,如果未能解决你的问题,请参考以下文章
用于确保在任何给定时间仅运行一个 shell 脚本的 shell 片段 [重复]
Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段