Shell编程 第一章 变量

一、变量定义


变量即在程序运行过程中它的值是允许改变的量。
变量是用一串固定的字符来标志不固定的值的一种方法。
变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存scripts运行时可更改的程序信息。
在shell中变量是不可能永久保存在系统中的,必须在文件中声明。

变量命名

  1. 只能使用数字,字母和下划线,且不能以数字开头

  2. 变量名区分大小写

  3. 建议命令要通俗易懂

注意:变量赋值是通过等号(=)进行赋值,在变量、等号和值之间不能出现空格。

二、变量分类


在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用于整数运算,功能相对较多
bclinux下的计算器,适合小数及整数运算
$[ ]用于整数运算

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值