shell编程

这篇博客详细介绍了Shell编程,包括Bash Shell的特性,如命令历史、路径补全和通配符。深入讲解了shell变量的定义、赋值、替换和运算,以及流程控制语句如if、case和循环。还涵盖了函数、参数传递和返回值,并提供了数组的应用实例。文章适合初学者和进阶者提升Shell编程技能。
摘要由CSDN通过智能技术生成

shell

1.shell概述

  1. 自动化批量系统初始化程序(update,软件安装,时区设置,安全策略…)
  2. 自动化批量软件部署程序(LAMP/LNMP,Tomcat/LVS/Nginx)
  3. 管理应用程序(KVM,集群管理扩容,MySQL)
  4. 日志分析处理程序(pv,UV,)
  5. 自动化备份恢复程序(MySQL完全备份/增量备份)
  6. 自动化的管理程序(批量远程修改密码,软件升级,配置更新)
  7. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,Tcp status,Apache,MySQl)
  8. 自动化扩容(增加云主机---->业务上线)

zabbix监控CPU 80% + Python API AWS/ES2(增加或者删除云主机)+ shell Script(业务上线)

  1. Shell可以做任何事(取决于业务需求)

2. Bash Shell

2.1 shell特性

1. 命令历史:shell进程会其会话中保存此前用户提交执行过的命令;
~]# history
定制history的功能,可通过环境变量实现:
HISTSIZE:shell进程可保留的命令历史的条数;
HISTFILE:持久保存命令历史的文件;
.bash_history
HISTFILESIZE:命令历史文件的大小;

2. 命令用法
history [-c] [-d 偏移量] [n]
或 history -anrw [文件名]

​ 或 history -ps 参数 [参数…]

​ -c: 清空命令历史;
​ -d offset:删除指定命令历史
​ -r: 从文件读取命令历史至历史列表中;
​ -w:把历史列表中的命令追加至历史文件中;
​ history #:显示最近的#条命令;

3. 调用命令历史列表中的命令:
!#:再一次执行历史列表中的第#条命令;
!!:再一次执行上一条命令;
!STRING:再一次执行命令历史列表中最近一个以STRING开头的命令;

注意:命令的重复执行有时候需要依赖于幂等性;

4. 调用上一条命令的最后一个参数:
快捷键:ESC, .
字符串:!$

5. 控制命令历史记录的方式:
环境变量:HISTCONTROL
ignoredups:忽略重复的命令;
ignorespace:忽略以空白字符开头的命令;
ignoreboth:以上两者同时生效;

​ 修改变量的值:
​ NAME=‘VALUE’
​ HISTCONTROL=‘ignoredups’ ----->只对当前shell有效

6. 命令补全:

​ shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当作命令;

​ 命令查找机制:
​ 查找内部命令;
​ 根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名;

​ 给定的打头字符串如果能惟一标识某命令程序文件,则直接补全;
​ 不能惟一标识某命令程序文件,再击tab键一次,会给出列表;

7. 路径补齐:

​ 在给定的起始路径下,以对应路径下的打头字串来逐一匹配起始路径下的每个文件:

​ tab:

​ 如果能惟一标识,则直接补全;
​ 否则,再一次tab,给出列表;

8. 命令行展开:

​ ~:自动展开为用户的家目录,或指定的用户的家目录;
​ {}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;

例如:

/tmp/{a,b} 相当于 /tmp/a /tmp/b

9. 命令的执行状态结果:

​ bash通过状态返回值来输出此结果:

​ 成功:0
​ 失败:1-255

命令执行完成之后,其状态返回值保存于bash的特殊变量$?中;

命令正常执行时,有的还回有命令返回值
根据命令及其功能不同,结果各不相同

引用命令的执行结果:

​ $(COMMAND)
​ 或`COMMAND`

10. 引用:

​ 强引用:’’
​ 弱引用:""
​ 命令引用:``

11.快捷键:

​ Ctrl+a:跳转至命令行行首
​ Ctrl+e:跳转至命令行行尾

​ Ctrl+u:删除行首至光标所在处之间的所有字符;
​ Ctrl+k:删除光标所在处至行尾的所有字符;

​ Ctrl+l:清屏,相当于clear

2.2 shell通配符

  1. globbing:文件名通配(整体文件名匹配,而非部分

    匹配模式:元字符

    ​ *:匹配任意长度的任意字符

    ​ ?:匹配任意单个字符

    ​ []:匹配指定范围内的任意单个字符

    ​ 有几种特殊格式

    ​ [a-z], [A-Z], [0-9], [a-z0-9]
    ​ [[:upper:]]:所有大写字母
    ​ [[:lower:]]:所有小写字母
    ​ [[:alpha:]]:所有字母
    ​ [[:digit:]]:所有数字
    ​ [[:alnum:]]:所有的字母和数字
    ​ [[:space:]]:所有空白字符
    ​ [[:punct:]]:所有标点符号

    ​ [^]:匹配指定范围外的任意单个字符

2.3 shell变量

2.3.1 shell变量概述
  1. 什么是变量

变量是shell传递数据的一种方法,简单理解:就是用一个固定的字符串去表示不固定的值,便于后续引用.

  1. 变量命名规范

变量定义时有名称要求:字母,数字,下划线几个组成,尽量字母开头,变量名称最好具备一定的含义

IP=10.0.0.100

IP1=10.0.0.100

Hostname_ip=10.0.0.100

hostname_ip=10.0.0.100

等号是赋值,需要注意:等号两边不能有空格,其次定义的变量不要和系统命令出现冲突

  1. shell变量定义方式:
    1. 用户自定义变量:人为定义变量名称
    2. 系统环境变量:保存的是和系统操作环境相关的数据。
    3. 位置参数变量:向脚本中进行参数传递,变量名不能自定义,变量作用是固定的。
    4. 预定义的变量:是Bash中已经定义好的变量,变量名不能自定义,变量的作用也是固定的。
  2. shell变量定义实践
#1 等号左右不能有空格
[root@mage scripts]# var="hello shell"
#2 引用变量用 $变量名
[root@mage scripts]# echo $var 
hello shell
[root@mage scripts]# echo ${var}_log
hello shell_log

#3 查看变量,set显示所有变量,包括自定义变量和环境变量
[root@mage scripts]# set |grep "var"
var='hello shell'

#4 引号的使用:单引号是强引用,双引号是弱引用
[root@mage scripts]# echo '$var is good'
$var is good
[root@mage scripts]# echo "$var is good"
hello shell is good

# 注意:在定义变量的时候使用单引号:
#	  在引用变量的时候,尽可能的使用双引号
2.3.2. 系统环境变量
#1) 定义环境变量: export 变量,将自定义变量转换成环境变量
[root@mage scripts]# var=hello
[root@mage scripts]# echo $var
hello
[root@mage scripts]# vim a.sh 
[root@mage scripts]# cat a.sh 
#!/bin/bash
echo $var
[root@mage scripts]# sh a.sh 	# 执行a.sh命令后,会使用另一个bash去执行,就访问不到$var

[root@mage scripts]# export var=hello
[root@mage scripts]# sh a.sh 
hello

#2) 简单使用系统变量
[root@mage scripts]# cat env.sh 
#!/bin/bash
echo "用户的家目录:$HOME"
echo "当前主机名称是: $HOSTNAME"
echo "当前所在目录: $PWD"
echo "当前连接服务器使用的地址和端口号: $SSH_CONNECTION"

2.3.3 系统内置的变量
[root@mage scripts]# cat variable.sh 
#!/bin/bash
echo "#当前shell的脚本名称: $0"
echo "#第1个shell脚本位置参数: $1"
echo "#第2个shell脚本位置参数: $2"
echo "#第3个shell脚本位置参数: $3"
echo "#所有传递的位置参数是: $*"
echo "#所有传递的位置参数是: $@"
echo "#总共传递参数个数是: $#"
echo "#当前程序运行的PID是: $$"
echo "#上一个命令执行结果:$?"

执行后结果如下:

[root@mage scripts]# bash variable.sh 11 22 33 44 55 66
#当前shell的脚本名称: variable.sh
#第一个shell脚本位置参数: 11
#第2个shell脚本位置参数: 22
#第3个shell脚本位置参数: 33
#所有传递的位置参数是: 11 22 33 44 55 66
#所有传递的位置参数是: 11 22 33 44 55 66
#总共传递参数个数是: 6
#当前程序运行的PID是: 1426
#上一个命令执行结果:0

-----------------------------------------------------------------------
#注意: $*和$@的区别
#	$*:把参数作为一个字符串返回
#	$@:把每个参数作为一个一个字符串返回

补充: 将命令执行的结果传递给变量.(命令替换)

# 根据系统时间打印今年的时间和明年的时间
[root@mage scripts]# echo "This is $(date +%Y) year"
This is 2021 year
[root@mage scripts]# echo "This is $(($(date +%Y)+1)) year"
This is 2022 year

# 命令的嵌套使用,使用$($())
[root@mage /]# find /root/ -name *.txt
[root@mage ~]# db=$(tar zcvf root.tar.gz $(find /root/ -name *.txt))
[root@mage ~]# echo $db  # 查看$db变量中存储的值

3. shell变量赋值

除了自定义变量, 以及系统内置变量,还可以使用read命令通过交互式方式传递变量

  1. read语法

    [root@mage scripts]# cat read_1.sh 
    #!/bin/bash
    read -p "提示信息:" var1
    # read -t 5 -p "提示信息:" var2
     
    echo "你输入的信息是" $var
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值