一、 初识shell

什么是shell

管理整个计算机硬件的其实是操作系统的核心 (kernel),这个核心是需要被保护的! 所以我们一般使用者就只能通过 shell 来跟核心沟通,以让核心达到我们所想要达到的工作。

shell的定义

Shell 是命令解释器 Shell 也是一种程序设计语言,它有变量,关键字,各种控制语句,有自己的语法结构,利用shell程序设计语言可以编写功 能很强、代码简短的程序

shell能做什么

  1. 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略...)
  2. 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
  3. 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
  4. 日志分析处理程序(PV, UV, 200, !200, top 100, grep/awk)
  5. 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
  6. 自动化管理程序(批量远程修改密码,软件升级,配置更新)
  7. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
  8. 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
  9. 自动化扩容(增加云主机——>业务上线) zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线)
  10. 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
  11. 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 被注释,将注释取消便可

11414906-a9c496e2a8e63168.png

永久生效,编辑 /etc/security/limits.conf
用户 限制的级别 类型 限制的值
比如
alice soft nofile 100
alice hard nofile 100
nofile 限制文件打开数量
nproc 网络连接数

特殊符

# 批注符号
\   转移符号,可以将具有特殊意义的符号变为一般字符
|   管道符,把前一个命令的结果传递给后一个命令,可以多个,以此类推
;   连续下达命令的分隔符
$   取用变量值的前缀符号
&   将一个工作置于后台
!   逻辑运算意义上的非
/   路径分隔符
>,>>  输出重定向,>覆盖,  >>追加
<,<<  输入重定向
''  单引号,单引号内的字符均视为一般字符
""   双引号,其内的字符具有特殊意义,具有变量置换功能
``   其内的命令可以先执行,建议用$( )取代
()  在中间为子shell的起始与结束
{}  在中间为命令区块的组合

管道

11414906-f30422400bd8ba31.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容