前言
变量的基础概念(主要是shell中)
广义上:变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。 变量可以通过变量名访问。在指令式语言中,变量通常是可变的;但在纯函数式语言(如Haskell)中,变量可能是不可变的。 在一些语言中,变量可能被明确为是能表示可变状态、具有存储空间的抽象(如在Java和Visual Basic中);但另外一些语言可能使用其它概念(如C的对象)来指称这种抽象,而不严格地定义“变量”的准确外延。(来源于百度百科)
通俗来讲:指值可以变的量,本身可变动.
Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。
shell中的变量类型
1.根据作用范围分类
全局变量(环境变量):全局生效 在各个bash中都生效 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2.根据系统划分
系统变量:系统维护,用于设置工作环境 自定义变量:用户自己定义,修改和使用.
其他划分
预定义变量:Bash中内置的一类变量 不能修改
只读变量:只能读 不能改
位置变量:通过命令行给脚本传递参数
环境变量:由系统维护,用于设置工作环境 当前目录 当前主机名等 如 $PATH
定义变量基本要求
name='value'
变量名=变量值
1.变量名和等号之间不能有空格, 同时,变量名的命名须遵循如下规则: 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。 中间不能有空格,可以使用下划线 _。 不能使用标点符号。 不能使用bash里的关键字(可用help命令查看保留关键字)。
2.变量名称:在linux系统中,变量名称一般都是大写,命令为小写,这是一种约定俗成的规范。 linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放的位置等。脚本中大量重复出现的可以用变量代替。
3.变量值:可以直接通过变量名称来提取到对应的变量值。
引用变量
变量引用:
$name #根据变量直接引用变量
${name}
"$name "
命令引用:name=`COMMAND` 或者 name=$(COMMAND)
{} #定义变量范围
弱引用和强引用
"$name " 弱引用,其中的变量引用会被替换为变量值
'$name' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串等同于$()
set:查看所有变量,包括局部变量和环境变量
取消变量: unset 变量名
变量追加
变量名+=追加值
root@c1 ~]# a=add
[root@c1 ~]# a+=add
[root@c1 ~]# echo $a
addadd
改变变量的作用范围
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。 可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所其子shell环境中可以继续使用
方法一:
- 直接设置全局变量 export 变量名=变量值
- decalre -x name=变量值 方法二: 修改局部变量为全局变量 export 变量名(name)
环境变量详解
1.由系统提前创建,用来设置用户的工作环境。 2.env查看环境变量
[root@c1 ~]# env
XDG_SESSION_ID=1
HOSTNAME=c1
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.100.1 56963 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
.............
3.环境变量:
- 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
- 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
- 一般只在系统配置文件中使用,在脚本中较少使用
4.常用的环境变量 | 环境变量 | 效果 | | ------ | ------ | | $USER | 当前登录用户名 | | $HOME | 宿主目录 | | $LANG |语言和字符集 | |$PWD | 当前所在工作目录 | | $PATH | 可执行用户程序的默认路径 | | $$ | 当前bash pid |
[root@c1 ~]# $$
bash: 1784
[root@c1 ~]# $USER
bash: root
[root@c1 ~]# $LANG
bash: zh_CN.UTF-8
[root@c1 ~]# $PWD
-bash: /root: 是一个目录
[root@c1 ~]# $PATH
-bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
1.环境变量配置文件
- /etc/profile 修改此文件会作用于所有用户 全局生效
- ~/.bash_profile 用户独立的配置文件,修改这个文件只作用于当前用可以用来长期变更或设置环境变量
[root@localhost ~]# echo "echo 'wokao'" > /data/a.sh //写一个脚本
[root@localhost ~]# cat /data/a.sh
echo 'wokao'
[root@localhost ~]# chmod a+x /data/a.sh //为脚本增加执行权限
[root@localhost ~]# vim /etc/profile //编辑全局配置文件
************************************************************
export PATH=$PATH:/data //将/data加入变量PATH中 全局生效
[root@localhost ~]# source /etc/profile //刷新文件,使立即生效
[root@localhost data]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data
[root@localhost ~]# a.sh //现在可直接使用文件名执行该脚本
wokao
只读变量
我们在定义shell变量时,默认定义的变量是可以被修改的,但有一种变量是不能修改的,就是只读变量。 且 -无法使用 unset删除 只读变量只能被赋值一次。只读变量在取得初始值之后,只能进行读取操作,不能重新赋值或删除。 定义变量
- 第一步:name=value # 定义一个变量
- 第二步:readonly name # 使用 readonly 来修饰该变量 ,表明只读
[root@c1 ~]# echo $a
addadd
[root@c1 ~]# readonly a
[root@c1 ~]# a=0000
-bash: a: 只读变量
位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示 且必须为整数,两位数需要{ },不然如"$10 是识别为$1和0 .
[root@c1 ~]# vim w.sh
[root@c1 ~]# bash w.sh 111 222 333
111 #$1 #$1 $2 $3
222 #$2
333 #$3
[root@c1 ~]# vim w.sh
#!/bin/bash
echo "$1"
echo "$2"
echo "$3"
预定义变量(常用几大符号)
bash 已经定义好 直接使用就可以 可以理解为乌龟de屁股. | 变量 | 效果 | | ------ | ------ | | $* | 将所有项当成一个值 返回 (一家人) | | $@ | 所有项 分割成一个一个的个体 显示 (家庭成员) | | $# | 后面参数的个数 (家里总共多少人) | |$0 | 脚本本身 | | $? | 表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,非 0值均表示执行出现异常 | |$! | 后台最后一个任务ID | | 双$ | 当前bash的进程id |
[root@c1 ~]# $$ #当前bash进程id
bash: 1784
键盘输入的内容赋值为变量
!!#ffff00 read !! !!#ffff00 read -p !! 常用
[root@c1 ~]# read -p "今天是星期几" datem
今天是星期几 星期一
[root@c1 ~]# echo $datem
星期一
- -s:安静模式,在输入字符时不再屏幕上显示,例如密码。
- -t:后面跟秒数,定义输入字符的等待时间。
- -n:后跟一个数字,定义输入文本的长度。
- -a:后跟一个变量,该变量会被认为是个数组。
重点:
双引号" ":强引用,识别变量,允许通过$符号引用其他变量值。
单引号' ':弱引用,不识别变量,禁止引用其他变量值,单引号内的内容都会被认为是普通字符。
反撇号` ` 和 $() :调用命令执行后输出的结果。如果存在嵌套,不能使用反撇号。
{ } :定义变量范围。