变量值及范围控制
引号在赋值中的应用
- “字符串…”
- 在双引号内允许$扩展,可调用其他变量的值
- 出现特殊字符时,可采用\符号转义
- 当变量值不包括空格、制表符时,双引号通常被省略
- ‘字符串…’
- 所有字符均视为该字符本身(无特殊含义)
- 不允许\转义
利用双引号赋值
- 将变量A的值赋给变量B
[root@Hincy:~]# A=CentOS6.5
[root@Hincy:~]# B=$A
[root@Hincy:~]# echo $B
CentOS6.5
- 有空格时,引号不可省略
[root@Hincy:~]# B=$A Server //未加引号时报错
-sh: Server: not found
[root@Hincy:~]# B="$A Server"
[root@Hincy:~]# echo $B
CentOS6.5 Server
常见的转义字符
- 普通字符<–>特殊字符
- \n 换行符、\t制表符、…
- \、"、#、…
[root@Hincy:~]# A="a\tb\tc\nd\te"
[root@Hincy:~]# echo $A
a\tb\tc\nd\te
[root@Hincy:~]# echo -e $A \\添加-e选项解析特殊转义符
a b c
d e
[root@Hincy:~]# FN="\\\""
[root@Hincy:~]# touch /$FN.txt
[root@Hincy:~]# ls -lh \\\".txt //可以在命令行内嵌入变量的值
-rw-r--r-- 1 root root 0 Jan 1 00:12 \".txt
利用单引号赋值
- 有利于保留特殊字符
[root@Hincy:~]# A=CentOS6.5
[root@Hincy:~]# B='$A Server' //$被视为普通字符
[root@Hincy:~]# echo $B //确认赋值结果
$A Server
read读入变量值
- 基本格式
- read 变量…
- read -p “提示信息” 变量名…
[root@Hincy:~]# read -p "svr5 login:" YOUR_NAME
svr5 login:Hincy
[root@Hincy:~]# echo $YOUR_NAME
Hincy
静默取值
- 启用read命令的-s选项
- 关闭输入回显(从键盘录入信息时,不显示在屏幕上)
- 适合读入敏感信息,提高安全性
[root@Hincy:~]# read -s -p "Password:" YOUR_PASS
Password:
[root@Hincy:~]# echo $YOUR_PASS
Hincy
read取值示例
- 一个简单的备份脚本
- 提示用户输入要备份的文件夹路径
- 使用tar命令备份该文件夹,存放到/opt/目录下
[root@Hincy:~]# cat dirbak.sh
#!/bin/bash
read -p "pls confirm the dir you want to backup:" SDIR
tar zcpPf /opt/dirbak.tgz $SDIR
[root@Hincy:~]# ./root/dirbak.sh
pls confirm the dir you want to backup: /boot
[root@Hincy:~]# ls -lh /opt/dirbak.tgz
-rw-r-r--. 1 root root 22M 1月 21 16:56/opt/dirbak.tgz
变量的作用范围
- 局部变量
- 只在定义此变量的当前Shell环境下有效
- 自定义变量默认都是局部变量
- 全局变量
- 在当前Shell及所有的子Shell环境下都有效
- 子Shell中若赋值同名变量,与父Shell中的变量无关
发布全局变量
- export 局部变量名[=变量值]
- 直接定义/赋值指定的变量,作为全局变量发布
- 对已有的局部变量,只需发布不需赋值
[root@Hincy:~]# X=123
[root@Hincy:~]# export Y=456
[root@Hincy:~]# bash
[root@Hincy:~]# echo $X,$Y
,456
[root@Hincy:~]# exit
exit
[root@Hincy:~]# echo $X,$Y
123,456
取消全局变量
- export -n 全局变量…
- 取消变量的全局属性
- 此操作对局部变量无实际意义
[root@Hincy:~]# export -n Y
[root@Hincy:~]# bash
[root@Hincy:~]# echo $Y
456
[root@Hincy:~]#
数值运算及处理
基本运算类别
-
四则运算
- 加法:num1 + num2
- 减法:num1 - num2
- 乘法:num1 * num2
- 整除:num1 / num2
-
取余数运算
- 求模:num1 % num2
计算并获取结果
- 使用expr命令工具
- 格式:expr 整数1 运算符 整数2…
- 乘法操作应采用*转义,避免被作为shell通配符
- 计算结果直接显示在屏幕上
[root@Hincy:~]# X=48;Y=21
[root@Hincy:~]# expr $X + 100 - $Y \* 2 / 7
142
[root@Hincy:~]# expr $X / $Y
2
[root@Hincy:~]# expr $X % $Y
6
算式替换
- 使用$[]表达式
- 格式:$[整数1 运算符 整数2 …]
- 乘法操作无需转义,运算符两侧可以无空格,引用变量可省略$符号
- 计算结果替换表达式本身,结合echo命令才能显示到屏幕上
[root@Hincy:~]# X=48;Y=21
[root@Hincy:~]# echo $[X+100-Y*2/7] //混合运算,乘法优先
142
[root@Hincy:~]#echo $[X/Y]
2
[root@Hincy:~]#echo $[X%Y]
6
[root@Hincy:~]#echo $[10**3]
1000
整数变量的自增处理
自增表达式
- 使用于更改单个变量的值
- 先运算,将运算结果保存到这个变量
- 后取值,以这个变量的新值作为整个表达式的值
运算类别 | 对应的表达式 | 应用示例 |
---|---|---|
加法 | i+=2或者i=i+2 | echo $[i+=2] |
减法 | i-=2或者i=i-2 | echo $[i-=2] |
乘法 | i*=2或者i=i*2 | echo $[i*=2] |
除法 | i/=2或者i=i/2 | echo $[i/=2] |
取模 | i%=2或者i=i%2 | echo $[i%=2] |
i+=1的极简化表示
- 当自变量自增/减的数量为1时
- 数量1可以省略、+=可以写成++、-=可以写成–
- 比如++i相当于i+=1、–i相当于i-=1
[root@Hincy:~]# X=48;Y=21
[root@Hincy:~]# echo $[++X],$[--Y]
49,20
[root@Hincy:~]# echo $X,$Y
49,20
++i与i++的区别
- 运算符在前,++i或–i
- 先运算,将运算结果保存到这个变量
- 后取值,调用这个变量的新值
[root@Hincy:~]# X=48;echo $[++X],$X
49,49
- 运算符在后,i++或i–
- 先取值,调用这个变量的旧值
- 后运算,将运算结果保存到这个变量
[root@Hincy:~]# X=48;echo $[X++],$X
48,49
使用let命令操作变量
- 操作变量值运算,并保存新结果
- 适用于不需要输出的情况,比如循环次数记录
- 若要查看结果,可结合echo命令
[root@Hincy:~]# X=48;Y=21
[root@Hincy:~]# let X++,Y/=3
[root@Hincy:~]# echo $X,$Y
49,7
使用随机整数
环境变量RANDOM
- 在/bin/bash环境可直接使用
- 每次被调用时,随机生成0-32767之间的一个整数
- 结合echo命令可查看效果
[root@Hincy:~]# echo $RANDOM
24546
[root@Hincy:~]# echo $RANDOM
1926
[root@Hincy:~]# echo $RANDOM,echo $RANDOM,echo $RANDOM
10446,7516,3136
扩大随机数范围
- 生成2个随机数,并计算相乘的结果
- 乘积结果的范围:0-32767*32767即0-1073676289
- 结合$[ ]表达式计算
[root@Hincy:~]# echo $[RANDOM*RANDOM]
244008
[root@Hincy:~]# echo $[RANDOM*RANDOM]
178013197
[root@Hincy:~]# echo $[RANDOM*RANDOM]
194682752
减少随机数范围
- 将随机数与指定的阈值相除,取余数
- 比如%1000,则求模结果的范围:0-999
- 结合$[ ]表达式计算
[root@Hincy:~]# echo $[RANDOM%1000]
526
[root@Hincy:~]# echo $[RANDOM%1000]
14
[root@Hincy:~]# echo $[RANDOM%1000]
237
限制随机数区间
- 将求模减小后的随机数与指定基值相加,取最终结果
- 比如0-999的随机数,再加1,则结果范围:1-1000
- 结合$[]表达式计算
[root@Hincy:~]# echo $[RANDOM%1000+1]
347
[root@Hincy:~]# echo $[RANDOM%1000+1]
24
[root@Hincy:~]# echo $[RANDOM%1000+1]
105
整数序列
使用seq命令
-
根据指定条件输出一组整数
- 默认从整数1开始
- 缺省的增量步长也是1
-
seq命令格式
- seq 末数
- seq 首数 末数
- seq 首数 步长 末数
从1开始的一组整数
- 格式:seq 末数
- 默认的分隔符为换行(\n)
- 选项-s可用来自定义字符串作为分隔符
[root@Hincy:~]# seq 4 //从1-4的整数序列,每行一个
1
2
3
4
[root@Hincy:~]# seq -s' ' 10 //从1-10的整数序列,以两个空格分隔
1 2 3 4 5 6 7 8 9 10
限定区间的一组整数
- 格式:seq 首数 末数
- 默认按整数值的实际位数显示
- 选项 -w 可以显示等宽效果,不足的数会添加前置0
[root@Hincy:~]# seq 8 10
8
9
10
[root@Hincy:~]# seq -w 8 10
08
09
10
限定区间及步长
- 格式:seq 首数 步长 末数
[root@Hincy:~]# seq 10 20 50
10
30
50
[root@Hincy:~]# seq -w -s' ' 0 50 500
000 050 100 150 200 250 300 350 400 450 500
小数运算处理
数值运算的局限性
- Bash内建机制仅支持整数值运算
- -expr命令、$[]表达式 不支持有小数的运算
[root@Hincy:~]# expr 123 + 45.678
expr:参数数目错误
[root@Hincy:~]# echo $[3.14*2]
-bash:3.14*2:syntax error:invalid arithmetic operator(error token is".14*2")
使用bc计算器
- 多数Linux系统默认安装此工具
- 支持高精度的数值运算
- 直接运行bc可进入交互式运算界面,quit退出
- 设置scale=n可约束小数位
[root@Hincy:~]# bc
12.34*56.78
700.66
scale=4
12.34*56.78
700.6652
quit
[root@Hincy:~]#
bc计算器的免交互
- 结合管道向bc发送表达式
- 多个表达式以分号分隔
- 通过echo命令+管道传递要计算的表达式
[root@Hincy:~]# A=12.34
[root@Hincy:~]# echo "$A*56.789" | bc
700.776
[root@Hincy:~]# echo "scale=4;$A*56.789;5/3" | bc
700.7762
1.6666
小数值的比较
- 基本用法
- echo “数值1 比较符 数值2” | bc
- 如果表达式成立,则返回的计算结果为1,否则返回0
- 常见比较操作:>、>=、<、<=、==、!=
[root@Hincy:~]# A=12.34;B=56.78
[root@Hincy:~]# echo "$A<=$B" | bc
1
[root@Hincy:~]# echo "$A>$B" | bc
0
以上就是本期文章的所有内容,感谢观看,如果对您有帮助请点赞关注+收藏,一键三连,多谢支持!