shell

一、变量的定义

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
上一次登录:二 927 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 923 16:50 first.sh
-rw-r--r--. 1 root root   9 926 10:55 ip.txt
-rw-r--r--. 1 root root 179 927 14:22 variable.sh
[root@Nchu150412 a]# chmod +x variable.sh
[root@Nchu150412 a]# ll
总用量 12
-rwxr-xr-x. 1 root root 207 923 16:50 first.sh
-rw-r--r--. 1 root root   9 926 10:55 ip.txt
-rwxr-xr-x. 1 root root 179 927 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、条件判断语法格式

格式1test 条件表达式
格式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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值