Shell编程基础进阶

为什么学习shell编程

shell脚本语言是实现linux/unix 系统管理机自动化运维所必备的重要工具,linux/unix系统的底层及基础应用软件的核心大部分涉及shell脚本的内容。每一个合格的linux系统管理员或运维工程师,都需要熟练的编写shell脚本语言,并能够阅读系统及各类软件附带的shell脚本内容。

什么是shell

shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户,这种对话方式可以是交互式(从键盘输入命令,可以立即得到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应用场景

系统基础配置

部署应用服务

配置应用服务

部署业务代码

应用服务备份

日志分析

监控应用服务

 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:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/189721ecd4cb9ca7dabc34afde2ff454.html