变量和引用
2.1.深入认识变量
2.1.1.什么是变量
变量是在程序中保存用户数据的一段内存存储空间,变量名是内存空间的首地址
变量三要素:名称、类型、值
2.1.2.变量的名称
组成: 字母、数字、下划线组成,不能以数字开头
变量名称的长度,shell没有明确规定,但是为了增加可读性,建议使用较短的、见名知意的名称命名则:
首字符必须为字母:a-z,A-Z
中间不能由空格,可以使用下划线 ()
不能使用标点符号
不能使用bash中关键字,输入help查看bash的保留字例:下面的变量名都是很好的选择
[root@server ~]# JAVA_HOME=/usr/bin/jvm/jre-1.6.0-openjdk.x86_64
[root@server ~]# SUM=0
[root@server ~]# back_up=/root
2.1.3.变量的类型
原则:shell是一种动态类型语言和弱类型语言,变量是不分数据类型的,统一都使用字符串存储,但根据变量的上下文环境,允许程序执行一些不同的操作,如:比较、整数加减
shell的变量数据类型
[root@server ~]# vim test1.sh
x=123let x+=1
echo "x=$x"
[root@server ~]# bash test1.shx=124
2.1.4.变量的定义
原则:直接使用,不需要变量声明。格式:变量名=变量的值
例:[root@server ~]# vim test2.sh
a=1
b="hello"
c="hello world"
bak_dir=/mnt
[root@server ~]# bash test2.sh前后不能收空格
[root@server ~]# a= 3
bash: 3: command not found...[root@server ~]# b =5
bash: b: command not found...
字符串类型建议使用双引好作为定界符引起,尤其是字符串中有空格
[root@server ~]# stu_name=zhangsanbash: san: command not found...
[root@server ~]# stu_name="zhang san'
[root@server ~]# stu_name='zhang san
2.1.5自定义变量
概念:上述以赋值形态形成的变量定义形式称为自定义变量
引用变量的值
$变量名
${表达式或变量名)例:
[root@server ~]# a=1024
[root@server ~]# echo $a
1024
[root@server ~]# echo {$a}
{1024}
[root@server ~]# echo ${a}
1024查看变量
[root@server ~]# set |more |grep a=
2.1.6.环境变量(全局变量)
环境变量又称为全局变量,可以在任意子shell生效,环境变量又分为自定义环境变量和bash内置的环境变量,用户退出命令后改变量会丢失,若需要永久保存就必须写在文件中
定义环境变量
例:
bash自带的全局变量:
[root@server ~]# vim /etc/profile
[root@server ~]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
[root@server ~]# echo $SHELL
/bin/bash自定义全局变量 :
法一:export 环境变量=值
[root@server ~]# export back_dir1=/home/fox
法二:
变量名=值
export 变量名
[root@server ~]# NAME=zhangsan
[root@server ~]# export NAME
法三:declare -X 变量名=值
[root@server ~]# declare -x AGE=20
显示全局变量:
[root@server ~]# env
[root@server ~]# printenv
[root@server ~]# export
注意:以上三者效果一样
注意:以上定义的环境变量都是临时的,重启后会失效,若要永久生效,则需要写入到配置文件中
2.1.7 shell 环境变量存储的文件
bash shell 初始化文件有: /etc/profile、 ~/.bash_profil、 ~/bash_login、~/.profile、 ~/.bashrc、/etc/bashrc
/etc/profile: 存放一些全局 (共有)变量,不管哪个用户,登录时都会读取该文件。通常设置一些Shell变量PATH,USER,HOSTNAME和HISTSIZE等
~/.bash_profile: (每个账户都有,只针对当前账户)每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时该文件仅仅执行一次,默认情况下,此文件通过脚本执行同目录下用户的.bashrc文件
~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取(每个账户都有,只针对当前账户,当前账户专用的变量)
/etc/bashrc: 为每一个运行bash shell的用户执行此文件当bash shell被打开时,该文件被
读取
/etc/inputrc文件为特定的情况处理键盘映射执行顺序:/etc/profile-->/etc/profile.d/*.sh--> ~/.bash profile -->/etc/bashrc-.>~/bashrc
2.1.8.位置变量
概念:当一条命令或脚本执行时,后面可以跟多个参数,可以使用位置变量来表示该参数
bash testl.sh hel1o world 123 456
当执行test1.sh 脚本时,第一个参数为hello到第四个参数可以使用特殊的符号表示,如:$1$2$3.....
常见的位置变量
$0 : 脚本名
$1-$9 : 1-9个参数
$[10} :10以上的参数需要大花括号括起
$* : 所有参数
$@ : 所有参数
$#:参数个数
$$:当前进程的PID
$! : 上一个后台进程的PID
$? : 上一个命令的返回值状态码,0为成功
[root@server ~]# vim test3.shecho "第一个位置的参数是:$1" echo "第二个位置的参数是:$2" echo "第四个位置的参数的:$4" echo "所有参数是:$*" echo "所有参数的:$@" echo "参数个数是:$#" echo "当前脚本的进程PID值:$$" echo "当前脚本的文件名$0"
[root@server ~]# bash test3.sh a b c d e f g
$* 与 $@区别:
当S* 和 S @没有被引用的时候,它们确实没有什么区别,都会把位置参数当成一个个体,"$*"会把所有位置参数当成一个整体(或者说当成一个单词),如果没有位置参数,则"S* "为空,如果有两个位置参数并且IFS为空格时,"$*"相当于"$1 $2"
"$@"会把所有位置参数当成一个单独的字段,如果没有位置参数 (S#为0),侧”S@"展开为空(不是空字符串,而是空列表),如果存在一个位置参数,则"S@"相当于"S1",如果有两个参数,则"S@"相当于"$1" "$2"等等