一、变量
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。
3.1变量基础
常见shell变量的类型包括:
自定义变量:由用户自己定义,修改和使用
预定义变量:Bash中内置的一类变量 shell 不能修改 规定好的变量 放在那里让你使用
环境变量:由系统维护,用于设置工作环境 当前目录 当前主机名啊 $PATH
只读变量:只可以读取不可以更改 只能不能修改 常量
位置变量:通过命令行给脚本传递参数
系统内置变量:PATH,UID,HOSTNAME,USER
3.1.1命名要求
- 区分大小写
- 不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
- 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
- 大驼峰 StudentFirstName
- 小驼峰 studentFirstName
- 下划线 student_name
name='value'
变量名=变量值
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除变量引用:
$name
${name}{}
弱引用和强引用
"$name " 弱引用,其中的变量引用会被替换为变量值
'$name' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串``$()
[root@localhost opt]# producet=kgc
[root@localhost opt]# echo $producet
kgc
[root@localhost opt]# version=6.0
[root@localhost opt]# echo $producet$version
kgc6.0
[root@localhost opt]# echo "$producet$version"
kgc6.0
[root@localhost opt]# echo '$producet$version'
$producet$version
[root@localhost opt]# echo $producet6.0
.0
[root@localhost opt]# echo ${producet}6.0
kgc6.0
[root@localhost opt]# echo ${producet}$version
kgc6.0
[root@node2 ~]#name=xiaoming
[root@node2 ~]#title=cto
[root@node2 ~]#echo $title_$name
xiaoming
[root@localhost ~]#echo ls
ls
[root@localhost ~]#echo $(ls)
abc.txt anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@localhost ~]#echo `ls`
abc.txt anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
1.变量追加值
格式:变量名+=追加值
3.1.2 read -p
从键盘输入的内容变成变量
3.1.3变量作用范围
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用
总结:export可以将指定的变量,变为全局变量
方法:
1. 格式1:export 变量名
2. 格式2:export 变量名=变量值
可以使用pstree 查看shell的环境
输入bash进入子shell
ctrl+D组合exit 退出子shell
也可以直接在定义变量的时候,加上export
3.1.4整数的运算expr
expr只能进行整数的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
运算符:
加法 +
减法 -
乘法 \ *
除法 /
取余 (取模)%
1.随机数生成器变量RANDOM
2.颜色
3.1.5系统各参数的脚本写入执行
3.1.6用户工作环境/etc/profile
3.17环境变量
1. 由系统提前创建,用来设置用户的工作环境
2. 可以使用env查看环境变量
3. 需要记住的常用环境变量
[root@localhost ftp]#env
#可以看到所有
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
环境变量:
1.可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
2.一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
3.一般只在系统配置文件中使用,在脚本中较少使用
3.1.8只读变量
变量值不允许修改(重新赋值)的情况
无<font color='red'>法使用 unset删除</font>
最快方法重启
[root@localhost opt]# name=ky15
[root@localhost opt]# readonly name
[root@localhost opt]# echo $name
ky15
[root@localhost opt]# unset name
bash: unset: name: 无法反设定: 只读 variable
#只有退出进程
[root@localhost opt]# echo $name
ky15
[root@localhost opt]# name=ky
bash: name: 只读变量
3.1.9位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
注意:只能定义 1-9,如果想要10,用{10}###定义变量10的范围就行了
3.1.10预定义变量
bash 帮你定义好了 拿来用就可以了,你不需要知道为什么,记住
- $*:表示所有位置参数的内容看成一个整体返回 返回所有
- $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
- $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
- $#:表示命令行中位置参数的总个数
- $0:表示当前执行的脚本或程序的名称 当前脚本的名字
- $$:当前bash的进程id
- $!: 后台任务最后一个id
1.$* 和 $@的区别
2.$#的含义
3.$0的含义
3.1.11 () {}
3.2测试
test###测试文件是否存在
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-a:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
-L: 测试是否为软连接文件
test -a###判断文件是否存在,存在返回0,有bug
test -e###判断文件是否存在,推荐使用这个
使用[ ]执行,与test一样
3.3比较整数数值
[ 整数1 -操作符 整数2 ] 公式
- -eq:第一个数等于(Equal)第二个数
- -ne:第一个数不等于(Not Equal)第二个数
- -gt:第一个数大于(Greater Than)第二个数
- -lt:第一个数小于(Lesser Than)第二个数
- -le:第一个数小于或等于(Lesser or Equal)第二个数
- -ge:第一个数大于或等于(Greater or Equal)第二个数
判断磁盘使用量,是否小于80
3.4字符串比较
常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
-n: 字符是否存在
格式
[ 字符串1 = 字符串2 ] 是否相同
[ 字符串1 != 字符串2 ] 是否不相同
[ -z 字符串 ] 是否为空
[ -n 字符串 ] 字符是否存在
3.5 逻辑测试 && 与 ||
&& 且
cmd1 成立 cmd2 成立 ,两个成立,结果才为真
cmd1 && cmd2
cmd1如果为假,cmd2就不会执行
|| 或
cmd1 cmd2,有一个为真,结果就为真