过了2周,终于学到shell cripte的编写了,回头看看鸟哥的菜已经吃完一半,还是略有成就感的,不过想想自己学了些什么,不知为什么也列举不出来太多。不管怎么说,现在Linux也算从零走到入门了吧,之后打算好好研究下Linux内核和Linux C编程,搞几个小项目深入下,有需要再看看系统管理什么的。废话不多说了,把今天看shell script的笔记整理出来吧。
编写shell script的良好习惯
1.文件头处记录
1.script的功能;
2.script的版本;
3.script的作者与联络方式;
4.script的历史记录;
5.script内较特殊的命令,最好使用“绝对路径”的方式来执行;
6.script执行时需要的环境变量预先生命与设置。
同时,根其他编码一样,添加适当的注释,整齐的缩进排版都是很重要的。
2.简单的范例:
从Hello World开始~
第一行:#!声明你所使用的shell名称:这个还是比较重要的,这样系统就能够加载bash的相关环境配置文件(一般来说就是non-login shell的~/.bashrc)
#作为注释的前缀,自我觉得这注释的颜色挺好看的哈。
在程序的开头,最好对主要的环境变量进行声明,比如PATH和LANG等是比较重要的2个,方便程序直接执行命令,而不必写绝对路径。
shell中的变量
1.变量的显示与设置:
echo $LANG 显示各种变量
1.使用等号对变量进行赋值:
EG:name=abc 自定义变量 echo $name 输出结果:abc
2.等号右边不能直接根空格符,且变量名称必须是英文字符与数字,不能数字开头(都比较基本啦)
3.变量内容若又空格等字符可使用双引号“”,单引号''将变量内容结合起来:
A.双引号中的特殊字符如$等,可以保有原本的特性:
eg:name= "$name its me" 输出变量原来的值 echo $name 输出结果:abc its me
B.单引号内的特殊字符作为一般文本字符原样输出:
eg:name= ' $name its me' 原样输出' '中的内容 echo $name 输出结果: $name its me
4.可以使用 \ 将特殊字符转换为普通字符([Enter] $ \ 空格 !等)
5. 增加变量内容:(读取变量值)
eg: name="$name"yes或者 name=${name}yes (推荐) echo $name 输出结果:abcyes
6.若要在等号右边调用命令输出:
eg: version = $(命令名称) version=$( uname -r )
7.若需要在其他子进程中也是使用该变量,需要使用export将该变量声明为环境变量
8.通常大写字符为系统默认变量。
9.取消变量的方法: unset 变量名称 unset name
2.环境变量的功能:
列出目前shell环境下的所有环境变量与其内容: env
列出所有的变量(环境变量与自定义变量):set
$(关于本shell的PID) 使用echo $就可以获得本线程的PID号码
?(关于上个执行命令的回传码)如果成功执行,回传0;如果执行发生错误,会回传“错误代码”
将自定义变量声明为环境变量:export 变量名称
影响现实结果的语系变量:
locale (本机目前设置)locale -a (系统所支持的全部语系)
3.变量键盘读取,数组与声明:
1.键盘读取:read [-pt] variable;
-p:宁可以接提示符 eg: read -p "Please input your name" name;
-t:接等待的秒数 eg: read -t 30 name。
2.变量的声明: declare [-aixr] variable
-a:将后面变量声明为数组类型;
-i:将变量声明为整型;
-x:将变量声明为环境变量;
-r:将变量声明为readonly类型,该变量不可悲更改内容,也不能重设。
变量类型默认为字符串;如果不小心把变量声明为只读,必须注销才登陆才能复原。
3.数组的声明: var[index]=content
eg:var[1]="small min"
var[2]="big min"
var[3]="nice min"
echo "${var[1]}, ${var[2]}, ${var[3]}"
4.变量内容的删除,替代和替换
变量设置方式 | 说 明 |
${变量#关键字} | 若变量内容从头开始的数据符合“关键字”,则将符合的最短数据删除 (删除第一个) |
${变量##关键字} | 若变量内容从头开始的数据符合“关键字”,则将符合的最长数据删除(剩下最后1个) |
${变量%关键字} | 从尾向前的数据符合“关键字”,则将符合的最短数据删除(删除第一个) |
${变量%关键字} | 从尾向前的数据符合“关键字”,则将符合的最长数据删除(剩下最前面的一个) |
${变量/旧字符串/新字符串} | 变量内容符合旧字符串,第一个旧字符串替换为新字符串 |
${变量//就字符串/新字符串} | 变量内容符合就字符串,所有的都替换为新字符串 |
变量的测试与替换方式
变量设置方式 | str没有设置 | str为空字符串 | str为非空字符串 |
var=${str-haha} | var=haha | var= | var=$str |
var=${str:-haha} | var=haha | var=haha | var=$str |
var=${str+haha} | var= | var=haha | var=haha |
var=${str:+haha} | var= | var= | var=haha |
var=${str=haha} | var=str=haha | var=str= | str不变 var=$str |
var=${str:=haha} | var=str=haha | var=str=haha | str不变 var=$str |
var=${str?haha} | error | var= | var=$str |
var=${str:?haha} | error | error | var=$str |
5.命令别名与历史命令
命令别名设置:alias, unalias(很简单)
eg: alias name='wolegequ' alias c='cal'
历史命令: history [n] [-c] [-raw] histfiles
n:列出最近的n条命令
-c:清楚目前shell中的所有内容
-a:将新增命令加入histfiles,若没有该文件,默认写入~/.bash_history
-r: read -w:write
echo $HISTSIZE 显示history的大小
!!执行上一条命令,!number 执行第几条命令
#:最终命令写入histfile的问题,只有最后注销的那个bash才回写入~/.bash_history
本作品由vortex.zhu创作
采用知识共享署名-非商业性使用-禁止演绎 2.5 *许可协议进行许可。
基于www.cnblogs.com上的作品创作。
Permissions beyond the scope of this license may be available at http://www.cnblogs.com/VortexPiggy/.