一 shell的学习路线
学习'shell的精髓':
1)'实质'其实就是一堆'命令的集合'而已,'文本处理,数据采集'
2)初学者从简单的shell脚本学起('先研究格式语法')
3) 再研究'编程思想'在里面('语言的编程规范')
4)脚本的'整体性能'-->'时间指标metrics'
5)脚本安全的规范('数据安全')和'脚本开发的规范(纳入版本控制)'
二 shell的变量
(1)变量的组成
变量 = '变量名' + '变量值'
变量名:变量名必须以'数字或下划线开头(begin)',后面可以跟'字母、数字、下划线',区分大小写'变量名大小写敏感'
变量值:变量值的来源'关注点-->信息源'
(2)变量的含义
变量名('标示符')的命名要清晰、明了,有明确的含义('见名知意'),最好使用'完整的单词'或'通俗易懂的缩写',避免产生歧义
(3)变量的命名规范
这里给出一种'参考规范':
1)'驼峰'命名风格'单词的首字母大写'
2) 多个单词以'_'进行组成
备注:'命名风格'应自始至终'保持一致',不可来回变化
###########比较科学的###########
GLOBAl_VARIABLE='globalvalue' -->'环境变量使用大写'
local_variable='localvalue' -->'局部变量使用小写'
function_name() -->'函数命名也使用小写'
{
}
注意:'禁止(forbidden)'-->'脚本的环境变量'和'系统公共环境变量'重名'rename'
(4)变量的类型
自定义变量:由用户自己定义、修改和使用
特殊变量:'环境变量'、'只读变量'、'位置变量'、'预定义变量'
变量作用域:'全局'变量、'局部'变量、'交互'定义变量
环境变量:
1)'全局'配置文件 --> /etc/profile* /etc/bashrc
2)'用户'配置文件 --> ~/.bashrc ~/.bash_profile
****************分割线('局部变量')****************
概念: 使用 'local' 声明特定功能的变量
声明和赋值应该在'不同行'
优点: 使用 local 来声明局部变量以确保其只在'函数内部和子函数中'可见,这避免了'污染(侵入性)'全局命名空间和'不经意间'设置可能具有函数之外重要性的变量
'强调':当赋值的值由命令替换提供时,'声明和赋值必须分开',因为内建的 local '不会从命令替换中'传递退出码
****************分割线('local的细节')****************
注意:当赋值的值'由命令替换提供时',声明和赋值'必须分开',因为内建的 local '不会'从命令替换中'传递'退出码
(5)变量的声明
声明: 变量名在左,变量值在右,=是'赋值符号',不是等于
variable_name="value"
规范: 变量赋值时'='两边'不能有空格'
使用: 在变量名之前'加$',最好'(这里规定必须)'是用"{}"包括变量
echo ${variable_name}
(6)变量要初始化
明确:由于shell是'弱文本类型',变量'虽然不需要'事先声明,但是如果不初始,可能在'脚本运行的过程中报错'
${var:=初始值} '采纳'
${var:-初始值}
########################对比########################
${var:-初始值} 只是'临时调用','变量var并不改变',仍然为空
${var:=初始值} 调用初始值后,变量'var也赋予了一个值'
补充:声明和赋值'可以分开',只要在'使用前初始化'即可
变量未初始化导致的错误
rm -fr ${chroot}/
分析:如果${chroot}未初始化'为空',可能导致文件系统的根'/'被'删除'
(7)变量来源
三 使用变量的一些细节
(1)对变量值进行判断,未使用"${variable}"
'判断场景':避免'变量值有空格'导致出现异常
报错
(2)只读变量:某些核心变量的变量值在数值传递的过程中,不能被改变 ‘常量’
报错
declare只读补充
说明
(1) 只读变量之后,'不能修改'该变量的属性,也'不能删除'该变量,所以在声明变量的时候,'应该慎用',避免'有去无回'
(2) 另外在命令行中敲readonly,你会发现有'很多只读变量',当然这些变量也是不能够被'修改或删除'的
(3)local局部变量的特性
提示
三 其他规范
规则1: '禁止'使用'数字或较奇怪的字符'来定义标示符
规则2: 用正确的'反义词组'命名具有'互斥意义'的变量或'相反动作(action)'的函数
规则3: '文件名'不要使用'大小写混排'方式
规则4: 对于'非循环'变量命名,'禁止'取单个字符'(eg:i、j、k)'毫无意义的