一、变量的定义
yum provides
:查询某个程序所在安装包,查看文件(命令)属于哪个软件
如已知apache 的一个压测工具名为:ab,但是不知道应该安装那个安装包的情况,使用yum provides指令参考如下:
[syt@Nchu150412 ~]$ yum provides rz
已加载插件:fastestmirror, langpacks
Determining fastest mirrors
* base: mirrors.bupt.edu.cn
* extras: mirrors.bupt.edu.cn
* updates: mirrors.aliyun.com
base/7/x86_64/filelists_db | 7.2 MB 00:00:02
extras/7/x86_64/filelists_db | 277 kB 00:00:00
lrzsz-0.12.20-36.el7.x86_64 : The lrz and lsz modem communications programs
源 :base
匹配来源:
文件名 :/usr/bin/rz
lrzsz-0.12.20-36.el7.x86_64 : The lrz and lsz modem communications programs
源 :@anaconda
匹配来源:
文件名 :/bin/rz
lrzsz-0.12.20-36.el7.x86_64 : The lrz and lsz modem communications programs
源 :@anaconda
匹配来源:
文件名 :/usr/bin/rz
./configure
是源代码安装的第一步,主要的作用是对即将安装的软件进行配置,检查当前的环境是否满足要安装软件的依赖关系。
yum clean all
清理yum缓存
yum makecache
缓存软件包信息
alias
#查看系统当前所有的别名
alias h5='head -5
’ #定义新的别名,这时候输入h5就等于输入’head -5’
1、常用的通配符
*
:匹配0或多个任意字符
?
:匹配任意单个字符
[list]
:匹配[list]中的任意单个字符,或者一组单个字符,[123],[1-13]为1,3。
[!list]
:匹配除list中的任意单个字符
{string1,string2,...}
:匹配string1,string2或更多字符串,{1…13}是1到13的意思
2、bash中的引号
双引号"":会把引号的内容当成整体来看待,允许通过$符号引用其他变量值
单引号'':会把引号的内容当成整体来看代,禁止引用其他变量值,shell中特殊符号都被视为普通字符。
反撇号``:反撇号和$()一样,引号或括号里的命令会优先执行,如果存在嵌套,反撇号不能用。
[root@Nchu150412 a]# echo "$(date +%F)"
2022-09-23
[root@Nchu150412 a]# echo "`date +%F`"
2022-09-23
[root@Nchu150412 a]# echo `echo "`date +%F`"`
-bash: command substitution:行1: 寻找匹配的 `"' 是遇到了未预期的文件结束符
-bash: command substitution:行2: 语法错误: 未预期的文件结尾
-bash: command substitution:行1: 寻找匹配的 `"' 是遇到了未预期的文件结束符
-bash: command substitution:行2: 语法错误: 未预期的文件结尾
date +%F
[root@Nchu150412 a]# echo $(echo "`date +%F`")
2022-09-23
shell就是人机交互的一个桥梁
3、shell脚本的基本写法
1、脚本第一行,魔法字符#!
指定解释器【必写】
#!/bin/bash
表示以下内容使用bash解释器解析
注意:
如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题,所以可以使用:#!/bin/env 解释器
2、脚本第二部分,注释(#号)说明,对脚本的基本信息进行描述【可选】
#!/bin/env bash
#以下内容是对脚本的基本信息的描述
#Name:名字
#Desc:描述describe
#Path:存放路径
#Usage:用法
#Update:更新时间
#下面就是脚本的具体内容
commands
...
3、脚本第三部分,脚本要实现的具体代码内容。
注意:标准执行方式脚本必须要有可执行权限啊
标准执行方式:
/shell01/first_shell.sh
./first_shell.sh
非标准执行方式(不建议):
1、直接在命令行指定解释器执行
-x:一般用于排错,查看脚本的执行过程
-n:用来查看脚本的语法是否有问题 bash -n first_shell.sh
2、使用source命令读取脚本文件,执行文件里的代码
source first_shell.sh
[root@Nchu150412 a]# A=hello
[root@Nchu150412 a]# echo $A
hello
[root@Nchu150412 a]# echo ${A}
hello
[root@Nchu150412 a]# A=123456
[root@Nchu150412 a]# echo $A
123456
[root@Nchu150412 a]# unset A
[root@Nchu150412 a]# echo $A
[root@Nchu150412 a]#
4、变量的定义规则
1、变量名区分大小写
2、变量名不能有特殊符号
特别说明:对于有空格的字符串给变量赋值时,要用引号引起来
[root@Nchu150412 a]# A=hello world
bash: world: 未找到命令...
[root@Nchu150412 a]# A="hello world"
[root@Nchu150412 a]# echo $A
hello world
3、变量名不能以数字开头
注意:不能以数字开头
4、等号两边不能有任何空格
[root@Nchu150412 a]# A =123
bash: A: 未找到命令...
[root@Nchu150412 a]# A= 123
bash: 123: 未找到命令...
[root@Nchu150412 a]# A = 123
bash: A: 未找到命令...
[root@Nchu150412 a]# A=123
[root@Nchu150412 a]# echo $A
123
5、变量名尽量做到见名知意
说明:一般变量名使用大写(小写也可以),不要同一个脚本中变量全是a,b,c等不容易阅读
5、变量定义方式有哪些?
(1)基本方式:直接赋值给一个变量
[root@Nchu150412 a]# A=1234567
[root@Nchu150412 a]# echo $A
1234567
[root@Nchu150412 a]# echo ${A:2:4} #表示从A变量中第3个字符开始截取,截取4个字符
3456
说明:
$变量名和${变量名}的异同
相同点:都可以调用变量
不同点:${变量名}可以只截取变量的一部分,而$变量名不可以
(2)命令执行结果赋值给变量—$()
3.10.0-1160.el7.x86_64
[root@Nchu150412 a]# B=$(uname -r)
[root@Nchu150412 a]# echo $B
3.10.0-1160.el7.x86_64
[root@Nchu150412 a]# A=$(hostname)
[root@Nchu150412 a]# echo $A
Nchu150412
(3)交互式定义变量(read)
目的:让用户自己给变量赋值,比较灵活
语法:read [选项] 变量名
常见选项:
选项 | 释义 |
---|---|
-p | 定义提示用户的信息 |
-n | 定义字符数(限制变量值的长度) |
-t | 定义超时时间,默认单位为秒(限制用户输入变量值的超时时间) |
-s | 不显示(不显示用户输入的内容) |
举例说明
用法1:用户自己定义变量值
[root@Nchu150412 a]# read name
harry
[root@Nchu150412 a]# echo $name
harry
[root@Nchu150412 a]# read -p "Input your name:" name
Input your name:jack
[root@Nchu150412 a]# echo $name
jack
[root@Nchu150412 a]# read -p "Input your password:" pass
Input your password:123
[root@Nchu150412 a]# echo $pass
123
[root@Nchu150412 a]# read -s -p "Input your password:" pass
Input your password:[root@Nchu150412 a]#
[root@Nchu150412 a]# echo $pass
123456
[root@Nchu150412 a]# read -p -n 5 "Input your name:" name #一定要把-n放在-p前面
-n
[root@Nchu150412 a]# read -n 5 -p "Input your name:" name #定义最多只能输入5个字符
Input your name:hhhhh[root@Nchu150412 a]# hh
[root@Nchu150412 a]# read -t 3 -p "name:" name #3秒之内没输入就自动取消输入
用法2:变量值来自文件
[root@Nchu150412 a]# vim ip.txt
[root@Nchu150412 a]# cat ip.txt
10.1.1.1
[root@Nchu150412 a]# read -p "qing shuru IP dizhi:" IP < ip.txt
[root@Nchu150412 a]# echo $IP
10.1.1.1
(4)定义有类型的变量(declare)
目的:给变量做一些限制,固定变量类型,比如:整型、只读
用法:declare 选项 变量名=变量值
常用选项:
[root@Nchu150412 a]# A=123
[root@Nchu150412 a]# echo $A
123
[root@Nchu150412 a]# A=hello
[root@Nchu150412 a]# echo $A
hello
[root@Nchu150412 a]# declare -i A=123
[root@Nchu150412 a]# echo $A
123
[root@Nchu150412 a]# A=hello
[root@Nchu150412 a]# echo $A
0
[root@Nchu150412 a]# A=333
[root@Nchu150412 a]# echo $A
333
[root@Nchu150412 a]# declare -r B=hello
[root@Nchu150412 a]# echo $B
hello
[root@Nchu150412 a]# B=8888
-bash: B: 只读变量
[root@Nchu150412 a]# unset B
-bash: unset: B: 无法反设定: 只读 variable
[root@Nchu150412 a]# AAAA=heima
[root@Nchu150412 a]# env|grep AAAA
[root@Nchu150412 a]# export AAAA
[root@Nchu150412 a]# env|grep AAAA
AAAA=heima
[root@Nchu150412 a]# declare -x BBBB=itcast
[root@Nchu150412 a]# env|grep BBBB
BBBB=itcast
6、变量的分类
(1)本地变量
本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。
(2)环境变量
环境变量:当前进程有效,并且能够被子进程调用
1、env
查看当前用户的环境变量
[root@Nchu150412 ~]# ps
PID TTY TIME CMD
2571 pts/0 00:00:00 su
2585 pts/0 00:00:00 bash
2621 pts/0 00:00:00 ps
[root@Nchu150412 ~]# CCC=888
[root@Nchu150412 ~]# export CCC
[root@Nchu150412 ~]# env|grep CCC
CCC=888
[root@Nchu150412 ~]# su - syt
上一次登录:二 9月 27 09:21:36 CST 2022:0 上
[syt@Nchu150412 ~]$ ps
PID TTY TIME CMD
2497 pts/0 00:00:00 bash
2693 pts/0 00:00:00 bash
2738 pts/0 00:00:00 ps
[syt@Nchu150412 ~]$ env|grep CCC
#env的意思是打印当前的环境变量,竖线“|”的意思是管道,即将env命令所打印出来的东西传给竖线之后的命令处理。grep是正则表达式过滤命令。当遇到包含“CCC“的行时会显示该行。整个命令就是显示包含“CCC”关键字的环境变量。
[syt@Nchu150412 ~]$
2、set
查询当前用户的所有变量(临时变量与环境变量)
3、export
变量名=变量值 或者 变量名=变量值;export 变量名
(3)全局变量
全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用。
解读相关配置文件
说明:以上文件修改后,都需要重新source让其生效或者退出重新登陆。
用户登陆系统读取相关文件的顺序
1、/etc/profile
2、$HOME/.bash_profile
3、$HOME/.bashrc
4、/etc/.bashrc
5、$HOME/.bash_logout
(4)系统变量
系统变量(内置bash中变量):shell本身已经固定好了它的名字和作用。
[syt@Nchu150412 ~]$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面
[syt@Nchu150412 ~]$ echo $?
0
[syt@Nchu150412 ~]$ lll
bash: lll: 未找到命令...
[syt@Nchu150412 ~]$ echo $?
127
[syt@Nchu150412 ~]$ ls /etc/aaaa
ls: 无法访问/etc/aaaa: 没有那个文件或目录
[syt@Nchu150412 ~]$ echo $?
2
举个例子:
[root@Nchu150412 a]# vim variable.sh
[root@Nchu150412 a]# ll
总用量 12
-rwxr-xr-x. 1 root root 207 9月 23 16:50 first.sh
-rw-r--r--. 1 root root 9 9月 26 10:55 ip.txt
-rw-r--r--. 1 root root 179 9月 27 14:22 variable.sh
[root@Nchu150412 a]# chmod +x variable.sh
[root@Nchu150412 a]# ll
总用量 12
-rwxr-xr-x. 1 root root 207 9月 23 16:50 first.sh
-rw-r--r--. 1 root root 9 9月 26 10:55 ip.txt
-rwxr-xr-x. 1 root root 179 9月 27 14:22 variable.sh
[root@Nchu150412 a]# ./variable.sh
$0 = ./variable.sh
$# = 0
$* =
$@ =
$1 =
$2 =
$3 =
$10 =
do you understand!
[root@Nchu150412 a]# ./variable.sh a b c
$0 = ./variable.sh
$# = 3
$* = a b c
$@ = a b c
$1 = a
$2 = b
$3 = c
$10 =
do you understand!
[root@Nchu150412 a]# ./variable.sh 1 2 3 4 5 6 7 8 9 10
$0 = ./variable.sh
$# = 10
$* = 1 2 3 4 5 6 7 8 9 10
$@ = 1 2 3 4 5 6 7 8 9 10
$1 = 1
$2 = 2
$3 = 3
$10 = 10
do you understand!
二、简单四则运算
算术运算:默认情况下,shell就只能支持简单的整数运算
运算内容:加(+)、减(-)、乘(*)、除(/)、求余数(%)
四则运算符号
注:用expr时,注意一定要空格。
let n=n**3:n的三次方
三、条件判断语法结构
1、条件判断语法格式
格式1:test 条件表达式
格式2:[ 条件表达式 ]
格式3:[[ 条件表达式 ]] 支持正则 =~
特别说明:
(1)[ 亲亲,我两边都有空格,不空打死你呦 ]
(2)[[ 亲亲,我两边都有空格,不空打死你呦 ]]
(3)更多判断,man test
去查看,很多参数都用来进行条件判断
2、条件判断相关参数
问:你要判断什么?
答:我要判断文件类型,判断文件新旧,判断字符串是否相等、判断权限等等。。。
(1)判断文件类型
[root@Nchu150412 a]# ls
first.sh ip.txt variable.sh
[root@Nchu150412 a]# touch file1
[root@Nchu150412 a]# ls
file1 first.sh ip.txt variable.sh
[root@Nchu150412 a]# echo hello > file2
[root@Nchu150412 a]# ls
file1 file2 first.sh ip.txt variable.sh
[root@Nchu150412 a]# ls
file1 file2 first.sh ip.txt variable.sh
[root@Nchu150412 a]# mkdir dir1
[root@Nchu150412 a]# test -e ./file1
[root@Nchu150412 a]# echo $?
0
[root@Nchu150412 a]# test -e ./test1 #只要文件存在,条件为真
[root@Nchu150412 a]# echo $?
1
[root