Day01-SHELL自动化编程-变量与特殊变量
- 1.编程概述
- 2.课程内容
- 3.Shell编程语言必知必会
- 4.编程语言分类(按照执行方式)-了解
- 5.编程环境准备
- 6.Shell脚本执行方式
- 6.1概述
- 6.2详解
- 6.2.1 sh或bash
- 6.2.1 .或source
- 6.2.3 相对或绝对路径
- 6.2.4 使用重定向符号执行脚本
- 6.3#!符号含义
- 7.从变量开始
- 7.1 变量?
- 7.2 变量命名
- 7.3 变量分类
- 7.3.1 普通变量
- 7.3.2 环境变量
- 7.3.3 环境变量相关文件及目录
- 7.3.4 特殊变量
- 7.3.4.1 特殊变量-位置变量
- 7.3.4.2 特殊变量-状态变量
- 7.3.4.3 特殊变量-变量子串
- 7.3.4.4 特殊变量-变量扩展(设置默认值)
- 7.4 变量总结
- 7.5 变量赋值
- 8.今日总结
1.编程概述
-
应用广泛: Shell占据的Linux半壁江山
-
企业要求:面试要求运维人员必会
-
目标
- 能够书写超过100行的脚本: 系统巡检,系统加固,系统优化(初始化),ngx优化,tomcat优化
- 总计完成书读写5000行脚本(读写)
-
复习要求:
https://www.yuque.com/lidao996/sre/vc088y5l9zof946c?singleDoc# 《SRE运维核心基操》
2.课程内容
- Shell概述,编程语言
- Shell环境准备
- Shell语法:变量,判断,循环,函数,数组
- Shell与三剑客进阶
- 实际案例与项目
3.Shell编程语言必知必会
-
Shell命令解释器:bash编程
-
常用命令解释器
命令解释器 | |
---|---|
bash | 目前应用最广泛一款命令解释器,红帽系列(默认),Debian,Ubuntu,BASH全称:Bourne-Again SHell |
dash | 一般debian/ubuntu系统默认的,运行脚本推荐使用 bash lidao.sh |
csh,tcsh | 一些unix系统使用 |
zsh | 功能更多,支持更多的插件,可以更好看。 |
shell脚本(.bash .sh),运行在ubuntu中的时候,不推荐使用sh运行,推荐使用bash运行。
4.编程语言分类(按照执行方式)-了解
编程语言分类 | 说明 |
---|---|
解析型:直接解析类 | shell,python,php, 书写成文件后,可以通过对应的解释器直接运行。 |
编译型:需要编译后运行 | C,C++,Java(maven),Golang,下载好源代码,必须要进行编译生成可以运行的命令。 |
- 解释型
[root@m01 devops-shell]# cat show.py
print("hello world")
[root@m01 devops-shell]# python show.py
hello world
- 编译型
[root@m01 devops-shell]# cat show.c
#include "stdio.h"
void main() {
printf("hello world c lang");
}
[root@m01 devops-shell]# gcc /server/scripts/devops-shell/show.c -o /server/scripts/devops-shell/show.bin
[root@m01 devops-shell]# /server/scripts/devops-shell/show.bin
hello world c lang
5.编程环境准备
环境 | ||
---|---|---|
主机 | m01 oldboy-devops-shell | 10.0.0.61/172.16.1.61 |
代码目录 | /server/scripts/devops-shell/ | |
编程环境 | vim/sublime…/编程环境IDE | 这里选择VIM或sublime即可。 |
vim配置 | 自动添加说明信息 | 创建.sh或.bash,自动添加信息 |
- 修改vimrc文件,达到控制vim创建,编辑文件的动作。
- 当前用户家目录下 ~/.vimrc(局部)
- 放在/etc/vimrc(全局)
set ignorecase # 搜索的时候忽略大小写
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()" # 设置条件创建.py .sh 文件的时候 使用SetTitle函数
func SetTitle() # 函数内容
if expand("%:e") =='sh' # 判断结尾是.sh
call setline(1, "#!/bin/bash") # setline写入行 1表示行号.
call setline(2,"##############################################################")
call setline(3, "# File Name:".expand("%"))
call setline(4, "# Version:V1.0")
call setline(5, "# Author:oldboy lidao996")
call setline(6, "# Organization:www.oldboyedu.com")
call setline(7, "# Desc:")
call setline(8,"##############################################################")
endif # 判断结束
endfunc # 函数结束
6.Shell脚本执行方式
6.1概述
应用及场景 | |
---|---|
通过sh或bash | 书写脚本后,最常用的方式;在其他非红帽系统中,建议使用bash运行脚本 |
通过.(点)或source | 加载/生效配置文件(环境变量,别名) /etc/profile 常用:可以用来实现include功能,把其他脚本引入到当天脚本中 |
通过相对或绝对路径 | 我们一般不推荐使用这种,一般都是系统脚本/服调用的脚本,脚本需要加上执行权限才能用 |
输入重定向符号 | 不推荐使用 |
6.2详解
6.2.1 sh或bash
[root@m01 devops-shell]# cat 01.show-v3.sh
#!/bin/bash
##############################################################
# File Name:01.show-v3.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
##############################################################
hostname
whoami
pwd
[root@m01 devops-shell]# sh 01.show-v3.sh
m01
root
/server/scripts/devops-shell
[root@m01 devops-shell]# bash 01.show-v3.sh
m01
root
/server/scripts/devops-shell
6.2.1 .或source
[root@m01 devops-shell]# . 01.show-v3.sh
m01
root
/server/scripts/devops-shell
[root@m01 devops-shell]# source 01.show-v3.sh
m01
root
/server/scripts/devops-shell
6.2.3 相对或绝对路径
- 给脚本加上执行权限
- 系统/服务调用某个脚本的时候这样用的
[root@m01 devops-shell]# chmod +x 01.show-v3.sh
[root@m01 devops-shell]# ll
总用量 76
-rwxr-xr-x 1 root root 265 2024-04-07 15:41 01.show-v3.sh
[root@m01 devops-shell]# ./01.show-v3.sh
m01
root
/server/scripts/devops-shell
[root@m01 devops-shell]# /server/scripts/devops-shell/01.show-v3.sh
m01
root
/server/scripts/devops-shell
6.2.4 使用重定向符号执行脚本
[root@m01 devops-shell]# sh < 01.show-v3.sh
m01
root
/server/scripts/devops-shell
6.3#!符号含义
- 并非注释的意思,写在脚本开头
- 用于指定脚本默认的命令解释器
命令解释器 | 写法 |
---|---|
bash | #!/bin/bash |
python | #!/usr/bin/python2 或 /usr/bin/env python2 |
#! /bin/bash
7.从变量开始
-
变量是啥?
-
变量分类
7.1 变量?
-
变量variable 变化。
-
小学题:已知 x=30,x+y=20,问y=?,y叫未知数。
-
查看变量内容$变量名字
-
赋值oldboy=lidao996
#变量定义(创建)
oldboy=lidao996
#变量取值
echo $oldboy
lidao996
关于变量的本质:
变量内存中的一块空间,变量名字==>内存空间地址
7.2 变量命名
变量名字命名要求:
- 不能以数字开头。
- 不能以特殊符号开头,可以以"_"开头。
- 推荐字母开头
变量的命名方式:
- 驼峰方式:personOfName personOfAge
- 现代式:单词(小写)+ "_下划线"连接 person_of_name
- 。。。。。
- 不要写,不能直接表示含义的变量。例如:a1=lidao a2=oldboy a3=996
7.3 变量分类
分类 | 说明 | 要求 |
---|---|---|
普通变量(局部变量) | 我们在脚本中通过oldboy=形式创建就是普通变量 | 常用,必会 |
环境变量(全局变量) | 一般都是系统创建,PATH,PS1… | 掌握几个常用的环境变量及含义 |
特殊变量 | shell脚本,命令,各种方面 | shell编程核心 |
7.3.1 普通变量
-
命名规则
-
使用
-
$符号变量命令,取出变量内容(取值)
day=6
echo $day
6
因为shell认为dayhao是一个变量,取值为空.
echo $dayhao
echo ${金庸}新作
-bash: ${金庸}新作: bad substitution
echo ${day}hao
6hao
温馨提示:
与 与 与{}一致,可以用于取值。
$变量
${变量} 指定变量名字
7.3.2 环境变量
-
全局变量: 1处定义,处处使用.
-
大部分都是系统定义的,我们一般就是修改.
env
export
declare
环境变量名字 | 含义 | 应用场景 |
---|---|---|
PATH | 记录命令位置的环境变量,运行命令的时候bash会在PATH的路径中查找 | 通过二进制包或编译安装软件,增加新的命令路径 |
LANG | 系统语言与字符集 Language中文 LANG=zh_CN.UTF8 LANG=en_US.UTF8 | 修改语言字符集 |
PS1 | 命令行格式 | 修改命令行格式,生产环境不推荐修改 |
UID或EUID | 用户的uid,用于判断当前用户是否为root | 用于脚本判断用户是否root |
HOSTNAME | 主机名 | |
历史四人组 | history命令 历史命令相关 | |
HISTSIZE | history 命令记录最多多条指令,生产环境尽量少 | 未来安全优化配置 |
HISTFILESIZE | history 历史记录文件的大小 ~/.bash_history 生产环境尽量少 | 未来安全优化配置 |
HISTCONTROL | 控制历史命令记录或不记录哪些内容 生产环境ignorespace 以空格开头的命令 不记录 | 未来安全优化配置 |
HISTFILE | 指定历史命令的记录文件的名字和位置,默认当前用户家目录 .bash_history | 未来安全优化配置 或 手写跳板机/行为审计 |
PROMPT_COMMAND | 存放命令,命令行执行命令后会运行这个变量的内容,用于实现行为审计(记录用户操作) | 手写跳板机/行为审计 |
IFS | 类似于awk -F 指定分隔符(指定每一列的分隔符) | 一般与循环配合读取文件内容 |
TMOUT | 超时自动退出时间 | 未来安全优化配置 |
- 修改环境变量
export 创建或修改全局变量(环境变量)
案例01 把当前系统语言改为中文,字符集改为UTF-8
export LANG=zh_CN.UTF-8
永久的就是写入到 /etc/profile最后即可.
source /etc/profile
env |grep LANG
LANG=zh_CN.UTF-8
7.3.3 环境变量相关文件及目录
文件或目录 | 应用场景 | |
---|---|---|
/etc/profile | 全局生效(国法) 存放函数,环境变量。存放别名 | |
/etc/bashrc | 全局生效(国法) 存放别名。 | |
~/.bashrc | 家规(局部生效) | |
~/.bash_profile | 家规(局部生效) | |
/etc/profile.d/ | 目录,每个用户登录的时候(远程连接与su切换),加载目录下面.sh结尾的文件 | 设置一些登录登录后提示,变化 |
案例01:书写脚本每次用户登录后显示系统的基本信息。
- 堆命令
要求显示的内容与格式:
主机名:m01-shell
ip地址:10.0.0.61 172.16.1.61
总计内存:1.9G
可用内存:1.5G
系统负载:0.32, 0.23, 0.25
- 分析:
- 找出每个步骤对应的命令
- 创建变量,存放命令结果
- 把变量的结果输出
- 测试后放在/etc/profile.d/目录下.sh结尾
第1步骤:获取指标的命令。
主机名: hostname
ip地址: hostname -I
内存总数:free -h |awk 'NR==2{print $2}'
可用内存: free -h |awk 'NR==2{print $NF}'
系统负载:uptime |sed 's#^.*age: ##g'
系统负载:uptime |awk '{print $(NF-2),$(NF-1),$NF}'
- 书写脚本与调试
[root@m01 devops-shell]# cat 01-login.sh
#!/bin/bash
##############################################################
# File Name:01-login.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
##############################################################
# 1.vars
hostname=`hostname`
ips=`hostname -I`
mem_total=`free -m | awk 'NR==2{print $2}'`
mem_ava=`free -m | awk 'NR==2{print $NF}'`
sys_load=`top bn1 | awk -F"[ ,]+" 'NR==1{print $(NF-2),$(NF-1),$NF}'`
# 2.print
cat <<EOF
主机名:$hostname
ip地址:$ips
总计内存:$mem_total
可用内存:$mem_ava
系统负载:$sys_load
EOF
- 实现目标 软连接过去即可
[root@m01 profile.d]# ln -s /server/scripts/devops-shell/01-login.sh /etc/profile.d/login.sh
[root@m01 profile.d]# ll /etc/profile.d/login.sh
lrwxrwxrwx 1 root root 40 2024-04-07 16:36 /etc/profile.d/login.sh -> /server/scripts/devops-shell/01-login.sh
-
重新登录并测试
-
小结:书写脚本流程
-
分析需求,取出什么指标,做什么内容.
-
把分析转换为命令.
-
书写脚本,调试脚本.
脚本的小bug:希望只有登录后提示,切换用户的时候不要提示。
# 判断两个变量是否存在即可,存在表示远程登录,不存在就切换用户. SSH_CLIENT=10.0.0.1 3399 22 SSH_TTY=/dev/pts/0
了解-环境变量文件加载顺序
7.3.4 特殊变量
- linux,shell编程中有各种各样的特殊变量,方便对参数,命令结果,进行判断与对比
特殊变量分类 | 核心 |
---|---|
位置相关的特殊变量 | ❤ ❤ ❤ ❤ ❤ |
状态相关的特殊变量 | ❤ ❤ ❤ ❤ ❤ |
变量子串 | ❤ |
变量扩展 | ❤ |
7.3.4.1 特殊变量-位置变量
位置的特殊变量 | 含义 | 应用场景 |
---|---|---|
$n(数字) | 脚本的第n个参数 | 命令行与脚本内部桥梁 |
$0 | 脚本的名字 | 用于输出脚本的格式或帮助的时候。用于错误提示输出帮助 |
$# | 脚本参数的个数 | 一般与判断结合,检查脚本参数个数。 |
$@ | 取出脚本所有参数 ($1,$2,$3, 4.... 4.... 4....n)。 | 数组中或循环中。 |
$* | 取出脚本所有参数 ($1,$2,$3, 4.... 4.... 4....n)。 | 数组中或循环中。 |
$n 位置参数
[root@m01 devops-shell]# cat 02-vars.sh
#!/bin/bash
##############################################################
# File Name:02-vars.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
##############################################################
echo "脚本第1个参数:$1 "
echo "脚本第2个参数:$2 "
echo "脚本参数数量:$# "
案例02:执行脚本的时候输入用户名,判断用户名是否存在
注意:这里的判断可以不用,直接使用id 用户名即可
[root@m01 devops-shell]# cat 02-check_user.sh
#!/bin/bash
##############################################################
# File Name:02-check_user.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc: 检查对应的用户是否存在(无判断)
##############################################################
# 1.vars
user=$1
# 2.检查
id $user
# 3.通过肉眼观察用户是否存在
echo "看到用户信息UID GID,用户存在"
echo "看到no such user,用户不存在"
[root@m01 devops-shell]# sh 02-check_user.sh oldbot
id: oldbot: no such user
看到用户信息UID GID,用户存在
看到no such user,用户不存在
[root@m01 devops-shell]# sh 02-check_user.sh root
uid=0(root) gid=0(root) 组=0(root)
看到用户信息UID GID,用户存在
看到no such user,用户不存在
- 分析:
- 命令行执行脚本的时候写上个用户名
- 脚本运行的时候用户名被传递给id命令
核心问题:如何把命令行中脚本的参数,传递到脚本内部
案例03-面试题: $n n大于9 会有什么问题?
$10
大于9后,会表示为$1 + 0 第1个参数+0
使用${}
[root@m01 devops-shell]# cat 03-question.sh
#!/bin/bash
##############################################################
# File Name:03-question.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
##############################################################
echo "$1 $2 $3 $4 $5 $9 $10 $11"
echo "$1 $2 $3 $4 $5 $9 ${10} ${11}"
echo "参数个数:$# "
[root@m01 devops-shell]# sh 03-question.sh {a..z}
a b c d e i a0 a1 #没有使用的有异常
a b c d e i j k #使用${}的正常了
参数个数:26
$0
案例04:如果脚本执行出错了,需要我们输出脚本的使用帮助:脚本名字 {star|stop|restart}
温馨提示:先略过如何检查是否出错.
echo "xxx.sh {start|stop|restart}"
-
分析
-
直接使用echo即可
[root@m01 devops-shell]# cat 04-script-name.sh
#!/bin/bash
##############################################################
# File Name:04-script-name.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
##############################################################
echo "help: sh $0 {start|stop|restart}"
[root@m01 devops-shell]# sh 04-script-name.sh
help: sh 04-script-name.sh {start|stop|restart}
[root@m01 devops-shell]# sh /server/scripts/devops-shell/04-script-name.sh
help: sh /server/scripts/devops-shell/04-script-name.sh {start|stop|restart}
案例05:判断脚本参数的格式,如果不等于1,则输出使用提示参考04案例
- $# 表示脚本参数的个数
[root@m01 devops-shell]# cat 05-check-param.sh
#!/bin/bash
##############################################################
# File Name:05-check-param.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc: 检查脚本参数个数是否为1
##############################################################
if [ $# -ne 1 ];then
echo "Help: $0 {start|stop|restart}"
exit 6
fi
echo "脚本正式功能。。。。"
[root@m01 devops-shell]# sh 05-check-param.sh w
脚本正式功能。。。。
[root@m01 devops-shell]# sh 05-check-param.sh d e w
Help: 05-check-param.sh {start|stop|restart}
案例06 了解: 输出脚本所有参数,输出脚本参数个数
参数个数不确定(生成环境中很少)
[root@m01 devops-shell]# cat 06-print-params.sh
#!/bin/bash
##############################################################
# File Name:06-print-params.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
##############################################################
echo "脚本名字:$0"
echo "参数的个数:$#"
echo "所有的参数:$@"
echo "所有的参数:$*"
[root@m01 devops-shell]# sh 06-print-params.sh {a..z}
脚本名字:06-print-params.sh
参数的个数:26
所有的参数:a b c d e f g h i j k l m n o p q r s t u v w x y z
所有的参数:a b c d e f g h i j k l m n o p q r s t u v w x y z
@ 和 @和 @和*区别: 仅仅在加上双引号后才有.
符号 共同点 区别 $@ 取出脚本所有的参数 加上双引号 会识别 合并在一起的参数,独立参数,正常的理解. $* 取出脚本所有的参数 加上双引号 所有参数合并为1个参数
# 演示:(仅了解)
[root@m01 devops-shell]# set "I am oldboy" techer lidao
[root@m01 devops-shell]# for i in "$*"; do echo $i; done
I am oldboy techer lidao
[root@m01 devops-shell]# for j in "$@"; do echo $j; done
I am oldboy
techer
lidao
小结:
位置的特殊变量 | 含义 | 应用场景 |
---|---|---|
$n(数字) | 脚本的第n个参数 | 使用最多,命令行与脚本内部桥梁 |
$0 | 脚本的名字 | 用于输出脚本的格式或帮助的时候。用于错误提示输出帮助 |
$# | 脚本参数的个数 | 一般与判断结合,检查脚本参数个数 |
$@ | 取出脚本所有参数 | 数组中或循环中 |
$* | 取出脚本所有参数 | 数组中或循环中 |
7.3.4.2 特殊变量-状态变量
状态的特殊符号 | 含义 | 应用场景 |
---|---|---|
$? | 上一个命令、脚本的返回值,0表示正确,非0即错误 | 一般与判断检查命令结果 |
$$ | 当前脚本的pid | 一般写在脚本中获取脚本pid |
$! | 上一个脚本/命令(持续运行)的pid | |
$_ | 上一个命令的最后一参数,其实下划线是个环境变量,记录了上一个命令、脚本的最后一个参数. 使用esc+ .(点) |
案例07: 输入任何一个命令并执行,检查这个命令的执行结果是否正确
- 分析:
- 输入命令(传参)
- 执行命令
- 检查结果 $?
- if判断如果是0,成功.
- if判断如果不是0,则失败
[root@m01 devops-shell]# cat 07-check_cmd.sh
#!/bin/bash
##############################################################
# File Name:07-check_cmd.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc: 检查输入的命令是否可以运行成功
##############################################################
# 1.vars
cmd="$*"
# 2.运行命令
$cmd &>/dev/null
# 3.判断
if [ $? -eq 0 ];then
echo "$cmd 运行成功"
else
echo "$cmd 运行失败"
fi
[root@m01 devops-shell]# sh 07-check_cmd.sh ls -l -r -a
ls -l -r -a 运行成功
[root@m01 devops-shell]# sh 07-check_cmd.sh derfojwper
derfojwper 运行失败
7.3.4.3 特殊变量-变量子串
-
变量子串 parameter expension变量扩展
-
格式${变量},写为$变量形式无法识别
-
作用:用于对变量处理。(统计变量中字符串数量,对变量内容进行替换,删除。。。)
-
应用:可以不用,如果使用效率高,格局打开
变量子串 parameter表示变量名字 | 含义 |
---|---|
基础 | |
${parameter} $para | 变量取值 |
${#parameter} | 统计字符长度(变量中有多少个字符) |
删除(开头,结尾) | word表示要删除的内容 |
${parameter#word} | 从变量左边开始删除,按照最短匹配删除 |
${parameter##word} | 从变量左边开始删除,按照最长匹配删除 |
${parameter%word} | 从变量右边开始删除,按照最短匹配删除 |
${parameter%%word} | 从变量右边开始删除,按照最长匹配删除 |
截取(切片) 类似于 cut -c | |
${var:5} | |
${var:5:2} | 从下标是5字符开始向后截取2个字符 |
替换 阉割版的sed | |
${para/word/replace} | 把word替换为replace 仅替换第1个 |
${para//word/replace} | 把word替换为replace 替换全部 |
统计字符串长度
oldboy="lidao996"
echo ${#oldboy}
8
oldboy="lidao 996"
echo ${#oldboy}
9
删除变量中的内容(仅影响输出)
演示:
var=oldboylidao996
echo ${var#oldboy}
echo ${var#o}
echo ${var#l}
echo ${var#*l}
echo ${var#*o}
echo ${varՎˁ*o}
- dir=文件的绝对路径
取出文件名
dir=/etc/sysconfig/network-scripts/ifcfg-eth0
echo ${dir##*/}
ifcfg-eth0
取出路径名
echo ${dir%/*}
/etc/sysconfig/network-scripts
温馨提示:取出路径中的文件名和目录:变量子串的方法,可以用dirname,basename命令也行。
截取(切片)
var=oldboy拆分 | ||||||
---|---|---|---|---|---|---|
切片的时候,每个字符都有个位置,从0开始 | o | l | d | b | o | y |
位置0 | 位置1 | 位置2 | 位置3 | 位置4 | 位置5 |
var=oldboy
echo ${var}
echo ${var:3}
boy
替换
var=oldboylidao996
echo ${var/o/-}
echo ${varՎˌo/-}
案例 08 面试题 I am oldboy teacher welcome to oldboy training class.
要求:bash for循环打印下面这句话中字母数不大于6的单词(昆仑万维面试题)。
shell思路:
循环取出这句话中每个单词.(处理掉非单词的内容:比如点)
判断单词的字符数:${#xxx}
输出
[root@m01 devops-shell]# cat 08-for.sh
#!/bin/bash
##############################################################
# File Name:08-for.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
##############################################################
# 1.var
str=`echo "I am oldboy teacher welcome to oldboy training class. "|sed 's#\.##g'`
# 2.for
# eq =
# ne !=
# lt less then <
# le less equal <=
# gt great than >
# ge great equal >=
for word in $str
do
# 3.通过if ${#} 对比字符串长度
if [ ${#word} -le 6 ];then
echo $word
fi
done
[root@m01 devops-shell]# sh 08-for.sh
I
am
oldboy
to
oldboy
class
各种判断条件:
1 # eq =
2 # ne !=
3 # lt less than <
4 # le less equal <=
5 # gt great than >
6 # ge great equal >=
- awk书写
[root@m01 devops-shell]# echo "I am oldboy teacher welcome to oldboy training class. "|xargs -n1|awk 'length($1)<=6'
I
am
oldboy
to
oldboy
class.
length() awk函数用于统计某一列或整行的字符数量 ${#var}
[root@m01 devops-shell]# echo "I am oldboy teacher welcome to oldboy training class. "|awk -vRS=" " 'length($1)<=6'
I
am
oldboy
to
oldboy
class.
[root@m01 devops-shell]# echo "I am oldboy teacher welcome to oldboy training class. "|awk -vRS="[ .]" 'length()<=6'
I
am
oldboy
to
oldboy
class
小结:
- 变量子串这部分整体熟悉: ${#变量} ${替换}
- 掌握几个:计算变量字符串长度,替换,删除。
7.3.4.4 特殊变量-变量扩展(设置默认值)
- 给变量设置默认值
格式 | 含义 |
---|---|
${parameter:-word} | 变量parameter没定义或为空,把word作为默认值,不修改变量内容(输出) |
${parameter:=word} | 变量parameter没定义或为空,把word作为默认值,修改变量内容 |
${parameter:?word} | 变量parameter没定义或为空,显示word,错误输出 |
${parameter:+word} | 变量parameter没定义或为空,则啥也不做,否则把word替换变量内容 |
变量没有值或没创建
echo $name
空值
echo ${name:-root}
root
变量进行赋值了
name=lidao996
echo ${name:-root}
lidao996
- :=
[root@m01 devops-shell]# echo $lidao
[root@m01 devops-shell]# echo ${lidao:=996}
996
[root@m01 devops-shell]# echo $lidao
996
- :+
[root@m01 devops-shell]# echo $lidao
996
[root@m01 devops-shell]# echo ${lidao:+lidao996}
lidao996
[root@m01 devops-shell]# echo $lidao
996
特殊变量小结:
- 为了shell编程增光添彩.
- 整体要认识。
常用特殊变量 | 必会 | 了解 |
---|---|---|
位置变量 | $n $0 $# | $@ $* |
状态变量 | $? | $$ $_ $! |
变量子串 | ${#parameter} ${para/lidao/oldboy} | 除了前面的 ${para#xxx} |
变量扩展(变量默认值) | 无 | ${para:-word} |
- man bash
7.4 变量总结
- 变量命名,要求
- 变量基础操作,赋值,取值.
- 金庸新作 ${变量}
- 变量分类
- 普通
- 环境变量
- 特殊变量
7.5 变量赋值
变量赋值语句
- 向变量中写入内容
赋值方法 | 格式 | 应用场景 |
---|---|---|
直接赋值 | oldboy=lidao996 | 大部分时候使用 |
命令结果赋值 | hostname=`hostname` | 获取命令的结果 ` ` 或$() |
脚本传参(通过脚本命令行传参进行赋值) | user_name=$1 脚本的第1个参数 | 一般用于命令行内容传入脚本中. 不想设置太多交互 |
read交互式赋值 | 通过read命令实现 | 与用户有个交互过程 |
读取文件内容赋值给变量 | 未来循环中说 | 脚本读取文件的时候使用 |
- read
read通过交互式的方式进行赋值 | |
---|---|
-p | 交互的时候提示信息 |
-t | 超过这个时间没有操作,则自动退出 |
-s | 不显示用户的输入.记录密码才用 |
- 基本用法
read -p "请输入密码:" pass
请输入密码:*******'''
echo $pass
*******'''
read -p "请输入密码:" pass
请输入密码:lidao996
echo $pass
lidao996
- 不显示用户的输入
[root@oldboy-devops-shell ~]# read -s -p "请输入密码:"pass
请输入密码:[root@oldboy-devops-shell ~]#
[root@oldboy-devops-shell ~]# echo $pass
lidao966
- 同时向2个变量赋值
read -p "请输入2个数字num1 num2:" num1 num2
请输入2个数字num1 num2:oldboy lidao
echo 我有预测能力,我知道你写了什么内容
我有预测能力,我知道你写了什么内容
echo $num1 $num2
oldboy lidao
案例09:用户输入1个字符串,然后进行显示
使用方法:执行脚本,用户输入1串内容,提示我是你肚子里蛔虫,你输入的内容是不是这个。。。。
read方法实现
[root@m01 devops-shell]# cat 09-guesspass.sh
#!/bin/bash
##############################################################
# File Name:09-guesspass.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
##############################################################
#1.提示
echo "我与你心有灵犀,我知道你的密码是什么"
read -p "请输入密码:" pass
#2.处理
echo "正在处理,请稍后,充值VIP,享受10倍速度"
sleep 5
echo "你的密码可能是:"
echo "$pass" |rev
[root@m01 devops-shell]# sh 09-guesspass.sh
我与你心有灵犀,我知道你的密码是什么
请输入密码:123456
正在处理,请稍后,充值VIP,享受10倍速度
你的密码可能是:
654321
8.今日总结
- 课上案例,自己再次进行书写,可以增加判断功能
- 总结核心内容
- 找找之前书写的脚本,阅读脚本