为什么学习shell编程
shell脚本语言是实现linux/unix 系统管理机自动化运维所必备的重要工具,linux/unix系统的底层及基础应用软件的核心大部分涉及shell脚本的内容。每一个合格的linux系统管理员或运维工程师,都需要熟练的编写shell脚本语言,并能够阅读系统及各类软件附带的shell脚本内容。
什么是shellshell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户,这种对话方式可以是交互式(从键盘输入命令,可以立即得到shell的回应),或非交互(执行脚本程序)的方式
shell种类交互式shell
非交互式shell
登录式shell
/etc/profile -> /etc/profile.d/*.sh -> ~/.bash_profile -> ~/.bashrc -> /etc/bashrc
非登录式shell
~/.bashrc -> /etc/bashrc
shell执行方式1、 bash script-name 或 sh script-name (生成一个子shell执行)
2、 path/script-name 或 ./script-name (添加执行权限执行,默认根据脚本第一行指定的解释器执行,如果没有指定则以当前默认shell解释器执行)
3、 source script-name 或 . script-name (以当前默认shell解释器执行)
4、cat script-name |bash
子shell子shell的本质是shell的子进程
子进程是由父进程的概念引申而来,在linux系统下,我们所运行的应用程序几乎都是从init(systemd)(pid为1的进程)进程延伸出来的,所以这些应用程序都视为init进程的子进程,而init则为它们的父进程
shell子进程是从一个父shell进程调用shell程序而产生的一个全新的shell,我们将这种全新的shell统称为这个父shell的子shell
产生子shell的情况
1、在父shell中执行一个shell脚本
bash ,执行环境不同,不能直接引用父shell变量,需export,定义的变量不能被父shell引用
2、在父shell中执行一条命令,在命令的末尾加上&
& ,执行环境相同,直接引用父shell变量,定义的变量不能被父shell引用
STR0='123';STR0='abc' &
echo $STR0
3、在父shell中执行一条命令,使用 () 中执行
(),执行环境相同,直接引用父shell变量,定义的变量不能被父shell引用
[root@web01 shell_class_03]# STR2='123' && (STR2='abc') && echo $STR2
123
4、在父shell中执行带管道的命令
管道,执行环境相同,直接引用父shell变量,定义的变量不能被父shell引用
[root@web01 shell_class_03]# STR1='123';echo 111 |STR1='ABC';echo $STR1
123
系统基础配置
部署应用服务
配置应用服务
部署业务代码
应用服务备份
日志分析
监控应用服务
shell基础命令补全和文件路径补全, 如果写错无法补全 table
命令历史记忆功能 history
别名功能 alias、unalias
常用快捷键 ctrl+u,k,a,e,l,c,z,d,r
前后台作业控制 bg,fg,jobs,screen
输入输出重定向 > >> 2> 2>> < << &> cat
| 将前者命令的标准输出交给后者命令的输入
|& 将前者命令的错误输出交给后者命令的输入
命令之间的关系; 没有逻辑关系,无论分号前面的命令执行是否成功都执行后者命令&& 前面执行成功, 则执行后者|| 前面执行不成功, 则执行后者
shell通配符匹配任意多个字符
? 匹配任意一个字符
[] 匹配括号中任意一个字符a-z,0-9,A-Z,a-Z
() 在子 shell 中执行(cd /boot;ls) (umask 077; touch file1000)
{} 集合 touch file{1..9}
shell模式匹配
使用shopt 内置命令启用shell选项 (extglob) 则会识别几个扩展模式匹配运算符。
模式列表是由 | 分割
查看shell选项 extglob
shopt |grep extglob启动shell选项 extglob
shopt -s extglob关闭shell选项 extglob
shopt -u extglob ** 模式 **** 说明 **?(pattern-list) 匹配给定模式零或一次
*(pattern-list) 匹配给定模式零次或多次
+(pattern-list) 匹配给定模式一次或多次
@(pattern-list) 匹配给定模式之一
!(pattern-list) 匹配除了给定的模式
[root@myCentOS6-clone ~]# ll total 0 -rw-r--r-- 1 root root 0 Nov 1 07:02 123 -rw-r--r-- 1 root root 0 Nov 1 07:02 aaaac -rw-r--r-- 1 root root 0 Nov 1 06:51 aaab -rw-r--r-- 1 root root 0 Nov 1 07:02 aad -rw-r--r-- 1 root root 0 Nov 1 07:02 aadg -rw-r--r-- 1 root root 0 Nov 1 07:02 bb -rw-r--r-- 1 root root 0 Nov 1 07:02 c [root@mycentos6-clone ~]# ls !(c|bb|123) aaaac aaab aad aadg [root@mycentos6-clone ~]# rm !(c|bb|123) -f [root@mycentos6-clone ~]# ll total 0 -rw-r--r-- 1 root root 0 Nov 1 07:02 123 -rw-r--r-- 1 root root 0 Nov 1 07:02 bb -rw-r--r-- 1 root root 0 Nov 1 07:02 c 单引号-双引号-没有引号 引号和不加引号的区别1 [root@zeqtx ~]# touch a b [root@zeqtx ~]# ll total 0 -rw-r--r--. 1 root root 0 Jun 25 16:25 a -rw-r--r--. 1 root root 0 Jun 25 16:25 b [root@zeqtx ~]# touch "a b" [root@zeqtx ~]# ll total 0 -rw-r--r--. 1 root root 0 Jun 25 16:25 a -rw-r--r--. 1 root root 0 Jun 25 16:25 a b -rw-r--r--. 1 root root 0 Jun 25 16:25 b 引号和不加引号的区别2: [root@zeq36 tmp]# ll 总用量 0 -rw-r--r-- 1 root root 0 6月 25 19:36 ? -rw-r--r-- 1 root root 0 6月 25 19:32 * -rw-r--r-- 1 root root 0 6月 25 19:33 aa -rw-r--r-- 1 root root 0 6月 25 19:33 abc -rw-r--r-- 1 root root 0 6月 25 19:33 b [root@zeq36 tmp]# ll ? -rw-r--r-- 1 root root 0 6月 25 19:36 ? -rw-r--r-- 1 root root 0 6月 25 19:32 * -rw-r--r-- 1 root root 0 6月 25 19:33 b [root@zeq36 tmp]# ll "?" -rw-r--r-- 1 root root 0 6月 25 19:36 ? [root@zeq36 tmp]# ll * -rw-r--r-- 1 root root 0 6月 25 19:36 ? -rw-r--r-- 1 root root 0 6月 25 19:32 * -rw-r--r-- 1 root root 0 6月 25 19:33 aa -rw-r--r-- 1 root root 0 6月 25 19:33 abc -rw-r--r-- 1 root root 0 6月 25 19:33 b [root@zeq36 tmp]# ll "*" -rw-r--r-- 1 root root 0 6月 25 19:32 * 双引号和单引号区别1:
关于$
[root@zeqtx ~]# echo "$LANG" en_US.UTF-8 [root@zeqtx ~]# echo '$LANG' $LANG 双引号和单引号区别2:关于``
[root@zeqtx ~]# echo "`which awk`" /bin/awk [root@zeqtx ~]# echo '`which awk`' `which awk` 双引号和单引号区别3: