文章目录
一、变量定义
变量即在程序运行过程中它的值是允许改变的量。
变量是用一串固定的字符来标志不固定的值的一种方法。
变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存scripts运行时可更改的程序信息。
在shell中变量是不可能永久保存在系统中的,必须在文件中声明。
变量命名
-
只能使用数字,字母和下划线,且不能以数字开头
-
变量名区分大小写
-
建议命令要通俗易懂
注意:变量赋值是通过等号(=)进行赋值,在变量、等号和值之间不能出现空格。
二、变量分类
在shell中变量分为以下四种类型
-
预定义变量
-
环境变量
-
局部变量(自定义)
-
位置变量
1、预定义变量
预定义的特殊变量有着特殊的含义,用户不可以更改,所有的预定义变量都由$符号和另外一个符号组成,常用的预定义特殊变量如下:
项目 | Value |
---|---|
$$ | 当前进程PID |
$? | 命令执行后的返回状态:0 为执行正确,非 0 为执行错误 |
$# | 位置参数的数量 |
$* | 所有位置参数的内容 |
$@ | 显示所有的参数 |
$! | 上一个后台进程的PID (wait命令中使用,后面讲) |
2、自定义变量
自定义变量:自己设置的变量自定义变量,只能再当前shell生效。其他shell是不生效的。
(1)引用变量
$ 变量名 或 ${变量名}
在进行变量叠加时,也可以使用${变量名}格式,变量名需要用双引号或 ${} 包含
(2)查看变量
echo $变量名
"set"可以查看所有变量(包括自定义变量和环境变量)
(3)取消变量
unset 变量名 仅在当前shell中有效
(4)升级变量:
export 变量名 由自定义变量变成环境变量
注:环境变量拥有可继承性:export之后就拥有继承性环境变量可以被向下继承
(5)交互定义变量
read:功能就是读取键盘输入的值,并赋给变量
read 变量名
-t 等待时间后,自动退出,执行下一条语句
-s 表示加密,不显示
-p 表示提示
(6)定义或引用变量时注意事项
" " 弱引用
' ' 强引用
` ` 优先执行
3、环境变量
环境变量也可叫全局变量,可以在创建他们的shell及派生出的子shell中使用(无需定义,直接可以使用,如:$UID)
相关命令:
set :输出所有变量
env:只显示全局变量
declare:输出所有变量,函数,整数等
变量作用范围: 在当前shell和子shell有效
1、在当前用户登陆后一直生效,可以将变量放到~/.bash_profile
2、在所有用户登陆后一直生效,可以将变量放到/etc/profile
4、位置变量
在用户运行脚本的同时输入参数,这些参数所对应的变量称为位置变量
基本语法
$n $0代表命令本身,$1-$9代表顺序参数编号,大于10的话使用括号,如${10}
$* 把所有参数当作整体
$@ 把每个参数分开对待
$# 所有参数的个数
例子:
[root@linux-server ~]# cd /opt/test/script/
[root@linux-server script]# vim weizhi.sh
#!/usr/bin/bash
echo 我的第一个位置参数是:$1
echo 我的第二个位置参数是:$2
echo 我的第三个位置参数是:$3
echo 我的第四个位置参数是:$4
echo 一共有 $# 个位置参数
echo 你输入的参数分别是:$*
[root@linux-server script]# chmod +x weizhi.sh
[root@linux-server script]# ./weizhi.sh 1 3 4 6
我的第一个位置参数是:1
我的第二个位置参数是:3
我的第三个位置参数是:4
我的第四个位置参数是:6
一共有 4 个位置参数
你输入的参数分别是:1 3 4 6
三、字符的转译及变量的声明
a=1;
$a # 表示变量,$表示取值
`` # 表示先执行该命令,反引号亦可用$() 代替
\ # 表示转义单个字符,\$a 此处的$只表示字符$
‘ ’ # 强引用,批量转译' '中出现的所有字符
“ ” # 弱引用,不能转义!,$,\,`,即该变量扩展和命令扩展在" "内仍是起作用的
${} # 变量声明
$[] # 运算,把shell中可变长字符转化为整型,以用来节省资源
四、变量运算
运算符
运算符号 | 含义 |
---|---|
+,- | 加法,减法 |
*,/,% | 乘,除,取余 |
** | 幂运算 |
++,– | 自增加,自减少 |
<, <=, >, >= | 比较符号 |
=, +=, -=, *=, /=, %= | 赋值运算 |
shell中常用的运算命令
运算操作与运算命令 | 含义 |
---|---|
(( )) | 用于整数运算 |
let | 用于整数运算,与(())类似 |
expr | 用于整数运算,功能相对较多 |
bc | linux下的计算器,适合小数及整数运算 |
$[ ] | 用于整数运算 |
1、expr命令
[root@server mnt]# a=123
[root@server mnt]# expr $a + 10 #注意:三个字符要用空格隔开
133
[root@server mnt]# expr $a - 10
113
[root@server mnt]# expr $a * 10 #此命令不能识别*,必须加\,\表示转译
expr: syntax error
[root@server mnt]# expr $a \* 10
1230
[root@server mnt]# expr $a / 10
12
[root@server mnt]# expr $a % 10
2、$[]和(()) 表达式
[root@server mnt]# echo $[a+10]
20
[root@server mnt]# echo $[a-10]
0
[root@server mnt]# echo $[a*10] #这里乘号不需要转译
100
[root@server mnt]# echo $[a/10]
1
[root@server mnt]# echo $[a%10]
0
[root@server mnt]# echo $((a+10))
20
[root@server mnt]# echo $((a-10))
0
3、let命令(let命令在执行后会保存新的值)
[root@server mnt]# a=10
[root@server mnt]# let a+=10
[root@server mnt]# echo $a # 查看a的值,发现ade值已经改变
20
[root@server mnt]# let a-=10
[root@server mnt]# echo $a
10
[root@server mnt]# let a*=10
[root@server mnt]# echo $a
100
[root@server mnt]# let a/=10
[root@server mnt]# echo $a
10
[root@server mnt]# let a%=10
[root@server mnt]# echo $a
0
4、小数运算工具bc
[root@server mnt]# echo "scale=4;1.23*4.56" | bc (scale=4,表示保留4位小数)
5.6088
[root@server mnt]# echo "scale=2;1.23*4.56" | bc
5.60
[root@server mnt]# echo 2.2+5.4 | bc
7.6
[root@server mnt]# echo 3.47+1.12 | bc
4.59
5、随机数RANDOM
这串代码特别简单,就是利用RANDOM这个随机数生成器进行取余就能够实现,至于为什么取余时需要+1是因为在取余时如果被整除那么余数会是0,这样就不在限定范围内了
取1到6之间的随机数:
echo $RANDOM
echo $(($RANDOM % 6 + 1))
5
取1-10之间的随机数:
echo $(($RANDOM % 10 + 1)
5
在脚本中
men=$[RANDOM % 3 + 1] 随机出现1-3的数字 []等于(())
练习(计算两个数的加减乘除)
[root@server mnt]# vim jisuan.sh
#!/bin/bash
echo "$1+$2=$[$1+$2]"
echo "$1-$2=$[$1-$2]"
echo "$1*$2=$[$1*$2]"
echo "$1/$2=$[$1/$2]"
echo "$1**$2=$[$1**$2]"
echo "$1%$2=$[$1%$2]"
[root@server mnt]# sh jisuan.sh 2 3
2+3=5
2-3=-1
2*3=6
2/3=0
2**3=8
2%3=2
五、变量的用法
1、匹配截取
指定位置截取字符串
语法:
${变量名:起始位置:长度} 从哪里截取留那里
[root@linux-server ~]# a=12345678
[root@linux-server ~]# echo ${a:5} #从左往右第5位开始截取,留下后三位
678
[root@linux-server ~]# echo ${a:3:4} #从第3位开始截取,留下后四位的,剩下的都不要。
4567
[root@linux-server ~]# echo ${a:2:-1} #从左往右第2位开始截取,从右往左截取第一位
34567
[root@linux-server ~]# echo ${a:2:-2}
3456
实例:
[root@localhost ~]# vim test11.sh
#!/usr/bin/bash
read -s -p "请输入您的11位手机号 " phone
echo
echo "你的手机号是 $phone"
echo "手机号后四位是 ${phone:7}"
2、匹配替换
(1)${parameter:-word}
若 parameter 为空或未设置,返回默认值但是并不把默认值赋值给该变量,若 parameter 不为空,则不替换,parameter 的值不变
[Neptuneyt]$ net=
[Neptuneyt]$ echo ${net:-'www.baidu.com'}
www.baidu.com
[Neptuneyt]$ echo $net 此时,变量依旧为空
(2) ${parameter:=word}
若 parameter 为空或未设置,把默认值赋值给该变量。若 parameter设置了,则不替换,parameter的值不变
[Neptuneyt]$ net=
[Neptuneyt]$ echo ${net:='www.baidu.com'}
www.baidu.com
[Neptuneyt]$ echo $net
www.baidu.com
(3) ${parameter:+word}
若 parameter 不为空时,返回默认值,并且也不重新赋值。
[Neptuneyt]$ net=www.baidu.com
[Neptuneyt]$ echo ${net:+'www.google.com'}
www.google.com
[Neptuneyt]$ echo $net #不改变变量原值
www.baidu.com
举个例子:
#!/bin/bash
echo "======================="
echo " 目前的版本有: "
echo " mysql-8.0"
echo " mysql-5.7"
echo " 默认版本为: MySQL-8.0"
echo "======================="
read -p "请输入你要选择的版本" Num
Num=`echo ${Num:=8.0}`
echo "您选择的版本为$Num,稍后给你安装......"
3、匹配删除
语法:
#*chr
表示删除从左到右第一个遇到的字符chr及其左侧的字符##*chr
表示删除从左到右最后一个遇到的字符chr及其左侧的字符(贪婪模式)%chr*
表示删除从右向左第一个遇到的字符chr及其右侧的字符%%chr*
表示删除从右到左最后一个遇到的字符chr及其右侧的字符(贪婪模式)
在键盘上,#在$ 符的左边,%号在$符的右边,为了便于记忆,大家因此可以记住 # 删除左边字符,%删除右边字符
参数解释:
项目 | Value |
---|---|
* | 表示全部字符 |
% | 最短尾匹配 |
%% | 最大尾匹配 |
% | 从右往左 |
# | 从左往右 |
实例:
[root@newrain ~]# url=www.sina.com.cn
[root@newrain ~]# echo ${url#*.} 从前往后匹配到“.”最短匹配
sina.com.cn
[root@newrain ~]# echo ${url##*.} 从前往后匹配到“.”,最长匹配
cn
[root@newrain ~]# echo ${url%.*} 从后往前匹配到“.”,最短匹配
www.sina.com
[root@newrain ~]# echo ${url%%.*} 从后往前匹配到“.”,最长匹配
www
[root@newrain ~]# echo ${url#a.} #不加*
www.sina.com.cn
[root@newrain ~]# echo ${url#*a.} #加*
com.cn