Shell脚本学习(1)
一.shell简介
shell是一个用C语言编写的程序,它是用户使用linux的桥梁。
shell既是一种命令语言,又是一种脚本语言。
- 脚本语言是相对编译型语言(例如C\C++、Java、C#等)而言的,它是为了缩短编译型语言编写、编译、链接、运行过程而创建的计算机编程语言。
- 脚本语言常常运行于底层,所处理的是字节、整数、浮点数或其他机器层的对象,是低级程序设计语言,它往往是解释运行而非编译,即由解释器读入脚本程序代码,将其转换成内部的形式执行,而解释器本身则是编译型程序。
- 脚本语言的好处是简单、易学,适合处理文件和目录之类的对象,以简单的方式快速完成某些复杂的事情。脚本的灵活性是以执行效率为代价,它的执行效率通常不如编译型语言,因此不适用于大型的项目、计算复杂的工程或有高级需求的应用软件,而适用于系统管理、文本处理等方面完成特定的功能的常用的小工具或小程序。
shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
shell脚本接收用户输入的命令,并把它送入内核去执行。内核是Linux系统的心脏,从开机自检时就驻留在计算机的内存中,直到计算机关闭为止,而用户的应用程序存储在计算机的硬盘上,仅当需要时才被调入内存。当用户登录Linux系统时,shell会被调入内存执行。shell独立于内核,它是连接内核和应用程序的桥梁,并由输入设备读取命令,再将其转为计算机可以理解的机械码,Linux内核才能执行该命令。如下图:
一般情况下,shell脚本默认文件扩展名为.sh,shell脚本运行的方法:作为可执行程序或作为解释器参数。
二.初识shell
作为刚刚进入shell世界的我们来说,学习shell简单的例子,会加深我们理解shell的工作原理。
1 !/bin/bash 2 echo "hello world!" #打印hello world!
如上shell脚本的简单的Demo,实现的功能是打印“hello world!”。其中,“#!”符号是Shell脚本的起始符号,也是指定一个文件类型的特殊标记,告诉Linux系统这个文件的执行需要指定一个解释器。“#!”符号后是指明解释器在系统中的路径名(即位置)。第2行命令中的echo命令用于向窗口输出文本,即“hello world!”。此行中的“#”符号是注释符,它后面直到本行结束的所有内容是注释,脚本执行时是不会执行的。最后,在编写脚本时,注意养成好习惯,可以在脚本的前面添加相应的注释,增加shell脚本的可读性,便于人们理解该脚本。
对于一般的shell脚本而言,解释器是bash或sh。
#!/bin/bash #/bin/sh
三.shell 变量
定义变量时,变量名不加美元符号,即变量名=初始值。
1 var="variable_NAME"
定义变量时,变量名和等号之间不能有空格,同时,变量名的命名必须遵循如下规则:
1)命名只能使用英文字母、数字和下划线,首个字符不能以数字开头。
2)中间不能有空格,可以使用下划线。
3)不能使用标点符号。
4)不能使用bash里的关键字。
使用一个定义过的变量,只要在变量名前面加美元符号即可。
1 name="lwei2" 2 echo $name #2行的效果与3行效果一样 3 echo ${name} #花括号是为了帮助识别变量边界
使用变量的一般格式: ${variable_name}。其中,花括号是可选的,是为了帮助解释器识别变量的边界。
使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。
1 #!/bin/bash 2 Company="HuaWei" 3 readonly Company 4 Company="Google"
如上Demo,运行后结果报错,提示如下:
./demo.sh: line 4: Company: readonly variable
只读变量定义的格式为:readonly variable_name
使用unset命名可以删除变量,格式:unset variable_name
1 #!/bin/sh 2 Addr="china" 3 unset Addr 4 echo ${Addr}
Shell变量分为局部变量、环境变量、shell变量。
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
环境变量时所有的程序,包括shell启动的程序,都能访问环境变量。有些程序需要环境变量来保证其正常运行。必要时shell脚本也可以定义环境变量。
Shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证shell的正常进行。
字符串是shell编程中最常见且有用的数据类型。字符串可以用单引号或双引号或不用引号。
单引号字符串的限制:单引号里的每个字符都会原样输出,单引号字符串中的变量时无效的。单引号字符串中不能单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
1 str='this is a string'
双引号字符串里可以有变量,可以出现转义字符。
1 name='lwei2' 2 str="Hello, I know the boy who are \"$name\"! \n" 3 echo -e ${str}
获取字符串长度: ${#variable_name}
1 string="abcde" 2 echo ${#string} #输出 5
提取子字符串:${variable_name:i:n},其中i=1,n>=i>=0且 n <=字符串长度。
1 string="china is a great country." 2 echo ${string:1:2} # 输出 hina
查找子字符串:`expr index “$variable_name” 子串`
1 string="lwei2 is a work" 2 echo `expr index "$string" e` # 输出 3
四.小总结
通过认识shell脚本的作用和工作原理,加上简单的例子,可以加深我们理解shell脚本语言。因此,想要熟练掌握shell脚本,除了认识和了解shell脚本的一些基本语法,加上多实践,多练习,方能熟能生巧。