什么是shell
管理整个计算机硬件的其实是操作系统的核心 (kernel),这个核心是需要被保护的! 所以我们一般使用者就只能通过 shell 来跟核心沟通,以让核心达到我们所想要达到的工作。
shell的定义
Shell 是命令解释器 Shell 也是一种程序设计语言,它有变量,关键字,各种控制语句,有自己的语法结构,利用shell程序设计语言可以编写功 能很强、代码简短的程序
shell能做什么
- 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略...)
- 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
- 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
- 日志分析处理程序(PV, UV, 200, !200, top 100, grep/awk)
- 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
- 自动化管理程序(批量远程修改密码,软件升级,配置更新)
- 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
- 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
- 自动化扩容(增加云主机——>业务上线) zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线)
- 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
- Shell可以做任何事(一切取决于业务需求)
shell的分类和更改
[root@biudefor ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@biudefor ~]# chsh -l
[root@biudefor ~]# ls /bin/*sh
默认shell :bash
注意:各种脚本里凡是/bin/sh表示的是使用默认的bash
查看当前使用的shell
[root@biudefor ~]# echo $SHELL
shell 的更改:
[root@biudefor ~]# chsh
[root@biudefor ~]# vim /etc/passwd
输出重定向
在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是:
0: Standard Input (STDIN)
1: Standard Output (STDOUT)
2: Standard Error Output (STDERR)
在标准情况下, 这些FD分别跟如下设备关联:
stdin(0): keyboard 键盘输入,并返回在前端
stdout(1): monitor 正确返回值 输出到前端
stderr(2): monitor 错误返回值 输出到前端
>a.txt
1>a.txt
2>a.txt
&>a.txt
1>&2
2>&2
一般来说, "1>" 通常可以省略成 ">".
1>&2 正确返回值传递给2输出通道 &2表示2输出通道,之前如果有定义标准错误重定向到某log文件,那么标准输出也重定向到这 个log文件,如果此处错写成 1>2, 就表示把1输出重定向到文件2中.
2>&1 错误返回值传递给1输出通道, 同样&1表示1输出通道.
例子,当前目录下只有a.txt,没有b.txt
[root@biudefor ~]# ls a.txt b.txt 1>file.out 2>&1
[root@biudefor ~]# cat file.out
ls: b.txt: No such file or directory a.txt
Bash的功能
藏终端输入:stty
stty -echo //隐藏命令的输入
[root@biudefor ~]# stty -echo
[root@biudefor ~]# //a=1
[root@biudefor ~]# 1 //echo $a
stty echo //恢复
[root@biudefor ~]#
[root@biudefor ~]# stty echo
命令别名
[root@biudefor ~]# alias //显示目前终端的全部别名
[root@biudefor ~]# alias ll='ls -l' //设置别名
[root@biudefor ~]# unalias ll 取消别名
历史命令history
history //列出全部历史命令记录
history 10 //显示最近10条执行过的命令
history -c //清除目前 shell 中的所以历史命令
history -w //即刻写入 .bash_history
使用执行
!25 //执行第25条历史命令
! ser //执行最近一次以 “ser”开头的命令
!! //执行上一条命令
注意history的安全问题,历史命令的记录数量上要控制好
history 无法记录时间
解决方法:可以透过~/.bash_logout来进行history的记录,并加上date来增加时间参数
bash 的登录主机欢迎信息: /etc/issue, /etc/motd
[root@biudefor ~]# vim /etc/issue
\d 本地端日期
\l 显示第几个终端机接口
\m 显示硬件等级(i386/i486/i586)
\n 显示主机的网络名称
\o 显示domain name
\r 操作系统的版本
\t 显示本地终端的时间
\s 操作系统的名称
/etc/motd //编辑这个文件,会在用户登录之后看到一些欢迎信息
bash脚本的执行
#./scripts
#/shelldoc/scripts
#. ./scripts 使用当前shell执行
#source ./scripts 使用当前shell执行 比如cd /tmp会改变当前shell环境,但是其他的方式不会
#bash scripts
子shell
(cmds) 表示开启子shell
[root@biudefor ~]# pwd
/root/shell
[root@biudefor ~]# (cd /tmp;touch test;)
[root@biudefor ~]# ls /tmp/test
/tmp/test
[root@biudefor ~]# pwd
/root/shell
子shell能够继承父shell的一些属性,但是子shell不能够反过来改变父shell的属性 子shell的好处之一可以将复杂的任务分成多个小任务,并行处理,加快执行速度。
所有shell的父shell父进程:systemd // 5,6是 init
{cmds} 不开启子shell
[root@biudefor ~]# { cd /tmp;touch test1; }
[root@biudefor ~]# pwd
脚本测试
•sh –x script
这将执行该脚本并显示所有变量的值
•sh –n script
不执行脚本只是检查语法模式,将返回所有错误语法
•sh –v script
执行脚本前把脚本内容显示在屏幕上
文件句柄
vim /etc/security/limits.conf
如果在配置文件不生效,可能是
vim /etc/ssh/sshd.config
usePAM yes 被注释,将注释取消便可

永久生效,编辑 /etc/security/limits.conf
用户 限制的级别 类型 限制的值
比如
alice soft nofile 100
alice hard nofile 100
nofile 限制文件打开数量
nproc 网络连接数
特殊符
# 批注符号
\ 转移符号,可以将具有特殊意义的符号变为一般字符
| 管道符,把前一个命令的结果传递给后一个命令,可以多个,以此类推
; 连续下达命令的分隔符
$ 取用变量值的前缀符号
& 将一个工作置于后台
! 逻辑运算意义上的非
/ 路径分隔符
>,>> 输出重定向,>覆盖, >>追加
<,<< 输入重定向
'' 单引号,单引号内的字符均视为一般字符
"" 双引号,其内的字符具有特殊意义,具有变量置换功能
`` 其内的命令可以先执行,建议用$( )取代
() 在中间为子shell的起始与结束
{} 在中间为命令区块的组合
管道
