Shell脚本编程常用指令(上)

变量值及范围控制

引号在赋值中的应用
  • “字符串…”
    • 在双引号内允许$扩展,可调用其他变量的值
    • 出现特殊字符时,可采用\符号转义
    • 当变量值不包括空格、制表符时,双引号通常被省略
  • ‘字符串…’
    • 所有字符均视为该字符本身(无特殊含义)
    • 不允许\转义

利用双引号赋值

  • 将变量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 121 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

以上就是本期文章的所有内容,感谢观看,如果对您有帮助请点赞关注+收藏,一键三连,多谢支持!

你可能感兴趣的:(脚本实战,linux,服务器,运维)