Day01-SHELL自动化编程-变量与特殊变量

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-shell10.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 变量命名

变量名字命名要求:

  1. 不能以数字开头。
  2. 不能以特殊符号开头,可以以"_"开头。
  3. 推荐字母开头

变量的命名方式:

  1. 驼峰方式:personOfName personOfAge
  2. 现代式:单词(小写)+ "_下划线"连接 person_of_name
  3. 。。。。。
  4. 不要写,不能直接表示含义的变量。例如: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命令 历史命令相关
HISTSIZEhistory 命令记录最多多条指令,生产环境尽量少未来安全优化配置
HISTFILESIZEhistory 历史记录文件的大小 ~/.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开始oldboy
位置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.今日总结

  • 课上案例,自己再次进行书写,可以增加判断功能
  • 总结核心内容
  • 找找之前书写的脚本,阅读脚本
  • 20
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值