变量
一、变量是什么
-
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
-
变量即在程序运行过程中它的值是允许改变的量。
-
变量是用一串固定的字符串去表示不固定的内容。
-
变量表示命令的内存空间,将数据放在内存空间中,通过变量名引用,获取数据。
二、shell变量的类型包括:
自定义变量:由用户自己定义,可以修改和使用,但是要避免改成已存在的命令或关键字。
环境变量:由系统维护,用于设置工作环境 可以用env命令查看(与系统有关可以修改,例如:$PATH规定了命令路径和补全)
只读变量:只可以读取不可以更改的变量(其实就是常量,不常用)
位置变量:通过命令行给脚本传递参数
预定义变量:Bash中内置的一类变量,不能修改。有些规定好的变量 放在那里让你使用(属于系统变量,一般不可修改)
如何自定义变量
shell变量不分数据类型
变量名=变量值
a = 10
[root@localhost ~]# a=10 //设置变量
[root@localhost ~]# echo $a //shell $变量名 调用变量
10
三、变量的命名要求
- 区分大小写
- 不能使程序中的保留字和内置变量:如:if, for,hostname 。
- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反。
- 不要使用内置的变量,使用英文尽量使用词义通俗易懂,如 PATH 。
- 大驼峰 StudentFirstName,字母开头需要大写。
- 小驼峰 studentFirstName,字母中间需要大小。
- 下划线 student_name。
name='value'
变量名=变量值 直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除。如果想要永久使用变量需要将变量写入文件./bashrc
或/etc/profile
中。
常用四大符号
-
{ } 大括号 :确定变量起始结束的范围,这种只要有变量就先加上,不加的话有可能会引发错误。
-
" " 双引号(弱引用(smart),可以识别变量
-
' ' 单引号 :强引用(stupid),不识别变量,输入什么就显示什么
-
`` 反撇 :调用命令执行结果 ,效果与 $( )相同
四、自定义设置变量
unset 变量名
取消变量
变量名+=追加值
追加变量的值
[root@localhost ~]# sergeancy=zhu //设置变量
[root@localhost ~]# echo $sergeancy
zhu
[root@localhost ~]# sergeancy+=xiaolong //变量名+=追加值增加变量内容
[root@localhost ~]# echo $sergeancy
zhuxiaolong //显示结果
read [-p “提示信息” ] 变量名
自定义变量
创建一个简易的正整数计算器
[root@localhost zhubao]# vim zhutou.sh //建立一个脚本
#!/bin/bash
#
read -p "输入一个正整数" a //自定义交互变量
read -p "输入一个正整数" b
expr $a + $b //仅支持正整数
[root@localhost zhubao]# bash zhutou.sh //执行脚本
输入一个正整数116 //输入正整数
输入一个正整数225
341 //得出结果
五、变量作用范围
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
可以通过内部命令export将指定的变量为全局变量(即环境变量),使用户定义的变量在所有子shell环境中可以继续使用。
[root@localhost zhubao]# zhu=fu //设置局部变量zhu
[root@localhost zhubao]# echo $zhu
fu
[root@localhost zhubao]# bash //进入子bash环境
[root@localhost zhubao]# echo $zhu //查看子bash环境中的zhu变量
//发现无效
[root@localhost zhubao]# pstree -p|grep bash //查看当前bash环境,发现现处于子bash
|-sshd(1139)---sshd(1186)---bash(1463)---bash(3017)-+-grep(3069)
[root@localhost zhubao]# exit //退出当前bash环境
exit
[root@localhost zhubao]# echo $zhu //再次输入zhu变量又恢复
fu
[root@localhost zhubao]# export zhu //export 变量名 (想要子shell也同步变量可使用export定义全局变量)
[root@localhost zhubao]# bash //再次进入子bash环境
[root@localhost zhubao]# echo $zhu //再次再该bash环境中输入可得到变量数值
fu
六、环境变量
- 由系统提前创建,用来设置用户的工作环境
- 可以使用env命令查看所有环境变量
- 需要记住的常用环境变量
[root@localhost ~]# env //可以查看到所有的环境变量
常用环境变量:
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
- 环境变量的特性:
- 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量。
- 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程。
- 一般只在系统配置文件中使用,在脚本中较少使用。
5.环境变量的配置文件:
自定义的环境变量只是临时生效,退出系统后就会失效。需要将自定义的环境变量放入配置文件中,才会永久生效。配置文件可以用来长期变更或设置环境变量。
全局配置文件:/etc/profile,修改此文件会作用于所有用户。
用户独立的配置文件: ~/.bash_profile,修改这个文件只作用于当前用户。
七、只读变量
在定义shell变量时,默认定义的变量是可以被修改的,但有一种变量是不能修改的,就是只读变量。
只读变量只能被赋值一次。只读变量在取得初始值之后,只能进行读取操作,不能重新赋值或删除。
root@localhost ~]# name=zhubao //设置一个变量
[root@localhost ~]# readonly name //使用readonly 表面只读,无法更改
[root@localhost ~]# echo $name
zhubao
[root@localhost ~]# name=zhutou //无法重新赋值
bash: name: 只读变量 //相当于是常量
[root@localhost ~]# unset name //更无法删除
bash: unset: name: 无法反设定: 只读 variable
想要删除该只读变量只能reboot重启。
八、位置变量
位置变量也称为位置参数。
使用$n表示,n为数字序列号,且必须为整数。
如:$1
、$2
、…、$9
、${10}
、${11}
这代表了实行脚本后的第多少个参数。
两位数需要加花括号{},不然$10
会被识别为:$1
和0
例如该脚本为计算器脚本
[root@localhost zhu]# vim jsq.sh //建立一个计算器脚本
#!/bin/bash
#read -p "请输入第一个正整数" n
#read -p "请输入第二个正整数" m
echo $[$1+$2] //$[$1+$2](第一参数+第二参数)
[root@localhost zhu]# bash jsq.sh 116 225 //运行脚本可得出结果
341
[root@localhost zhu]# vim data.sh
#!/bin/bash
echo $1 //位置一参数
echo $2 //位置二参数
echo $3 //位置三参数...
echo $4
echo $5 //如果遇到双数需要把当前参数加上大括号{},否则会默认成两个个位数组成。
[root@localhost zhu]# bash data.sh {a..z} //对应参数按顺序打印a-z字母,
a
b
c
d
e
九、预定义变量
预定义变量是系统定义好的变量,用来保持脚本程序的执行信息。
可以直接使用这些变量,不能直接为这些变量赋值。
变量 | 作用 |
---|---|
$? | 显示上一次执行命令结果是否正确。反馈 0 表示执行正确,反馈任何非 0值均表示执行出现异常。 |
$* | 表示所有位置参数的内容。当整体返回。(将输入的参数作为一个单词) |
$@ | 表示所有位置参数的内容。当个体返回。可作为数组。(将参数内容分割成n份,每份作为独立个体) |
$# | 表示命令行中位置参数的总个数。 |
$0 | 表示当前脚本名称(如果是软链接,显示当前软链接文件名)。 |
$_ | 表示在此之前执行的命令或脚本的最后一个参数。 |
$$ | 获取当前bash进程的PID。 |
shell中的变量运算
shell中的运算
- 运算内容:(加 +)、 (减 -)、 (乘 *)、 (除 /)、 取余(取模)%
- 运算符号:
$[]
和 $(()) - 运算命令:expr和
let
- 运算工具:bc (系统自带)
运算符:
- 加法 + (num1 + num2)
- 减法 - (num1 - num2)
- 乘法 \ * (num1 \ * num2)
- 除法 / (num1 / num2)
- 取余 (取模)% (num1 % num2 (求 num1 除以 num2 的余数))
运算演示:
默认情况下bash只支持整数运算,不支持小数运算,bc可以计算小数。
echo $[算术表达式] //echo进行调用
[root@localhost ~]# echo $[1+6]
7
[root@localhost ~]# echo $[2+5]
7
[root@localhost ~]# echo $[12/6]
2
[root@localhost ~]# echo $[2*6]
12
[root@localhost ~]# echo $[11/6] //这样运算会自动排除小数
1
[root@localhost ~]# echo $[1.1/6]
-bash: 1.1/6: 语法错误: 无效的算术运算符 (错误符号是 ".1/6") //无法进行小数运算
可运用变量进行运算
[root@localhost ~]# z=225
[root@localhost ~]# f=116
[root@localhost ~]# echo $[z+f]
341
[root@localhost ~]# echo $[z*f]
26100
[root@localhost ~]# echo $[z/f]
1
[root@localhost ~]# let z=2+5 //let特殊符号的运算
[root@localhost ~]# echo $z
7
[root@localhost ~]# i=1 //设置一个变量
[root@localhost ~]# let i++ //自加一
[root@localhost ~]# echo $i
2
[root@localhost ~]# let i-- //自减一
[root@localhost ~]# echo $i
1