变量的定义
本质上讲,变量就是在程序中保存用户数据的一块内存空间,而变量名就是这块内存空间的地址
在程序的执行过程中,保存数据的内存空间的内容可能会不断地发生变化,但是,代表内存地址的变量名却保持不变
变量的命名
变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头
用户应该尽可能选择有明确意义的英文单词作为变量名,尽量避免使用拼音或者毫无意义的字符串作为变量名。这样的话,用户通过变量名就可以了解该变量的作用
变量的类型
根据数据类型分类
shell是一种动态类语言和弱类型语言
强类型语言
强类型语言,当你定义一个变量是某个类型,如果不经过代码显式转换强制转化
过,它就永远都是这个类型,如果把它当做其他类型来用,就会报错
弱类型语言
弱类型语言,你想把这个变量当做什么类型来用,就当做什么类型来用,语言的解析器
会自动隐式转换
根据作用域分类
全局变量
环境变量也可称为全局变量,可以在创建它们的shell及其派生出来的任意子进程shell中
使用(su - 切换用户会读取新的环境变量),环境变量又可分为自定义环境变量和bash内置
的环境变量
用户的环境变量配置
~/.bash_profile或者~/.bashrc
全局环境变量的配置
/etc/bashrc或/etc/profile或者/etc/profile.d
注意:
按照系统规范,所有环境变量的名字均采用大写形式。在将环境变量应用于用户
进程程序之前,都应该用命令export导出
局部变量
普通变量也可称为局部变量,与全局变量相比,局部变量的使用范围较小,通常仅限于
某个程序段访问,例如函数内部。在Shell语言中,可以在函数内部通过local关键字定义局部
变量,另外,函数的参数也是局部变量
变量的定义
在Shell中:
通常情况下用户可以直接使用变量,而毋需先进行定义,当用户第一次使用某
个变量名时,实际上就同时定义了这个变量,在变量的作用域内,用户都可以使用该变量
#变量名=变量值
[root@localhost shell]# a=8
[root@localhost shell]# echo $a
8
#可以使用反引号`` 或者$(命令)来把一个命令的结果赋值给变量
变量名=`ls`
变量名=$(ls)
[root@localhost shell]# f=`ls`
[root@localhost shell]# echo $f
example1.sh read01.sh
小贴士:
赋值的时候=的左右不能有空格
当内容中存在特殊字符或者空格的时候建议使用 " "括起来
引用变量: $变量名 或者 ${变量名}
查看变量:echo $变量名
取消变量: unset 变量名
位置参数和预定义变量
从命令行传递给Shell脚本的参数又称为位置参数,Shell脚本会根据参数的位置使用不同的位
置参数变量读取它们的值
变量 | 说明 |
$# | 命令行参数的个数 |
$n | 表示传递给脚本的第n个参数,例如$1表示第一个参数,$2表示第二个参数,$3表示第三个参数 |
$o | 当前脚本的名称 |
$* | 以"参数1 参数2 参数3…"的形式返回所有参数的值 |
$@ | 以"参数1""参数2""参数3"…的形式返回所有的值 |
$? | 前一个命令或者函数的返回状态码。$?的返回值用法: (1)判断命令、脚本或函数等程序是否执行成功 (2)若在脚本中调用执行“exit 数字”,则会返回这个数字给“$?”变量 (3)如果是在函数里,则通过“return 数字”把这个数字以函数值的形式传给“$?” |
$$ | 返回本程序的进程ID(PID),不常用 |
$! | 获取上一个在后台工作的进程的进程号 |
$_ | 保存之前执行的命令的最后一个参数 |
![](https://i-blog.csdnimg.cn/blog_migrate/46a5f279cbc1935c7a860c1732bfe466.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2b9b6d2c786574c9b374b04e091bc160.png)
Shell中的引用
转义字符\ | 如果将\放到特殊字符前面,shell就忽略这些特殊字符的原有含义,把它们当作普通字符对待 |
'' 单引号 | 如果将字符串放到一对单引号之间,那么字符串中所有字符的特殊含义被忽略 |
""双引号 | 双引号的引用与单引号基本相同,包含在双引号内的大部分特殊字符可以当作普通字符处理,但是仍然有一些特殊字符保留自己的特殊含义 包括 $ 和\和 ` |
[root@localhost ~]# echo "current user is: $USER"
current user is: root
[root@localhost ~]# echo 'current user is: $USER'
current user is: $USER
[root@localhost ~]# echo 'current user is: `whoami`'
current user is: `whoami`
[root@localhost ~]# echo "current user is: `whoami`"
current user is: root