SHELL 变量和引用
一、变量的定义及命名
- 变量就是程序设计语言中的一个可以变化的量,当然,可以变化的是变量的值。几乎所有的程序设计语言中都有定义变量,并且其涵义也大同小异。从本质上讲,变量就是在程序中保存用户数据的一块
内存空间
(即是临时的),而变量名就是这块内存空间的地址。也可以作为一个表达式或一个命令。 - 在程序的执行过程中,保存数据的内存空间的内容可能会不断地发生变化,但是,代表内存地址的变量名却保持不变。(即变量是值可能会一直变,但变量名却保持不变)
- 命名:在Shell中,变量名可以
由字母、数字或者下划线
组成,并且只能以字母或者下划线开头。
二、变量的类型
1.根据数据类型分类
Shell是一种动态类型语言和弱类型语言
- echo $test_var # 输出变量值
- echo “$test_var” # 如果要作为一个整体,尽量用双引号
- echo ‘$test_var’ # 输出 $test_var
- echo $(pwd) # 获取该命令的执行结果
2. 根据作用域分类
- 环境变量
-
使用declare -x 或 export 导出才可以叫环境变量
-
也叫全局变量
-
所有环境变量的名字都采用大写,且要导出
-
分为自定义环境变量
- 一般是指用export内置命令导出的变量,用于定义shell的运行环境,保证shell命令的正确执行。环境变量可以在命令行中设置和创建,但用户退出命令行时这些变量值就会丢失,即该环境变量只在当前 shell和子shell中有效。如果希望永久保存环境变量,可以在配置文件中设置。
- 如果在命令行定义一个变量 data ,和 export data2导出 ,在脚本里输出它们,再利用bash执行脚本,那么只有data2可以被导出值。
- 如果想永久保存环境变量
1) 用户的环境变量配置
在~/.bash_profile
或~/.bashrc
里定义
2) 全局环境变量的配置
在/etc/bashrc
、/etc/profile
文件或者/etc/profile.d
目录中定义 定义环境变量
的三种方式:
设置过后需要重新用户连接,才会去访问该配置文件,才会生效。或者用 sourc 或 . 执行重新执行脚本,不会产生子进程。
-
和bash内置的环境变量
shell内置的环境变量是所有的shell程序都可以使用的变量。包括有 PATH、HOME、COLUMNS、HISTFILE、HISTSIZE等
-
- 普通变量
- 脚本或命令行定义的变量
- 普通变量也可称为局部变量,与全局变量相比,局部变量的使用范围较小,通常仅限于某个程序段访问,例如函数内部。在Shell语言中,可以在函数内部通过local关键字定义局部变量,另外,函数的参数也是局部变量。
三、变量的定义
1. 变量名=变量值
- 定义路径
变量名=/xxx/xxx.txt - 命令结果赋值变量
变量名=$(ls) -->或反引号引用 - 注意:=前后不能有空格
- 引用变量:
$变量名
或者${变量名}
- 查看变量:
echo $变量名
- 取消变量:unset 变量名
- 作用范围:仅在当前shell中有效
2. 位置参数和预定义变量
- 位置参数:从命令行传递给Shell脚本的参数又称为位置参数,Shell脚本会根据参数的位置使用不同的位置参数变量读取它们的值。
- 例如:
$@ 和 $* 的区别
:
$@ 是以个体/数组/列表的形式返回的;而 $* 是以整体的形式返回的
四、变量的运算
1. 运算符
2. 运算操作符与运算命令
(())
-->用于整数运算的常用运算符 ,括号中不需要使用 $ 符号
let
-->用于整数运算,变量名毋需使用 $ 符号
expr
-->可用于整数运算- 计算:
- 判定数字还是字母
- 计算:
bc
-->一个计算器程序
$[]
-->用于整数运算
declare
-->用于整数运算
3. 表达式
echo $data = echo ${data}
${#parameter}
-->内容长度
${parameter:start}
-->截取字符串到末尾
${parameter:start:lenth}
-->截取字符串:几个
${parameter#word}
-->删除最短匹配 -->从左向右
${parameter##word}
-->删除最长匹配
${parameter%word}
-->删除最短匹配 -->从右向左
${parameter%%word}
-->删除最长匹配
${parameter/pattern/string}
-->string替代第一个pattern
${parameter//pattern/string}
-->string替代全部pattern
注意:替换完不影响data值
五、练习
练习1
定义两个变量:num1=10和num2=2
使用(()): 计算num1 + num2的值并输出
使用let: 计算num1 * num2的值输出
使用expr: 计算num1 对 num2执行或的位运算
使用$[]: 计算 num2的num1次方值
declare: 计算 num1 除以 num2的值
计算num2除num1的值(使用bc)
- 编辑一个脚本文件并在命令行输出
练习2
path=/data/data1/data2.txt
去获取它所在的目录
去获取文件的名字
练习3
设置一个只针对root的环境变量: ENV_ROOT=ROOT
设置一个针对所有用户的环境变量: ENV_ALL=ALL
在root用户下访问:ENV_ROOT和ENV_ALL
在普通用户下访问:ENV_ROOT和ENV_ALL
- 在root用户的
~/.bash_profile
文件内添加变量ENV_ROOT=ROOT - 在
/etc/profile
文件内添加变量ENV_ALL=ALL - 在root用户下访问,先
su -
重新连接一下
- 在普通用户下访问,
su - redhat