日期: 2015年09月13日
shell、变量的概念
What is SHELL?
<<========================================【SHELL】========================================>>
shell:是一个交互式进程,用户通过shell与内核进行交互工作
广义上的shell分为两类:
GUI:Graphic UI 即是图形界面的用户接口,常见的GUI有
Gnome
KDE
Xfce
CLI:Command Lie Interface 即是命令行接口,常见的CLI有
bsh(作者:Boarn, 又称为bsh)
csh
tcsh
ksh
bash(Boarn again shell)==>Bsh的再次发行版
zsh
查看系统支持的SHELL列表: cat/etc/shells
查看当前使用的shell:echo $SHELL
shll也称为命令解释器,它接收到用户输入的命令后先进行词法分析
如:哪些是命令本身,哪些是命令的选项和参数等……
然后再传递给内核处理,再把内核处理的结果输出到屏幕返回给用户
大多数Linux发行版默认shell为bash
Bash是一种解释型语言,但它也提供了交互式接口,支持变量,因此提供了编程环境,
所以可以称bash为程序语言。
解释型语言属于弱类型语言,其特点为:
1.它不强制区分变量类型,即无论存储什么数据,默认均以字符格式(ASCII码)存储。
2.不需要事先声明变量,需要时直接使用,直接赋值;
What is VARIABLE?
<<========================================【变量】========================================>>
变量:变量事实上是一块命名的内存空间,可用于存储数据,且空间可以按需改变。
使用变量的通常步骤为:
1.声明,指定变量的类型。声明的同时,通常会给其一个初始值,这个过程叫做变量的初始化
2.赋值。变量的赋值用 = 表示,例如: A=10,
shell中的变量赋值:
变量名=值
★注意:变量在赋值时不能使用$;
变量名只能包含字母、数字和下划线,而且不能以数字开头;
变量名区别大小写;
bash变量种类:
本地变量:作用范围是当前shell进程
定义变量: [set]Var_Name="Value"
引用变量: ${Var_Name}
撤销变量: unset Var_Name
环境变量:作用范围是当前shell进程及其子进程
直接生成变量为环境变量:
export Var_Name="Value"
先定义本地变量,再使用export命令导出为环境变量
Var_Name="Value"
export Var_Name
示例:分别演示两种生成环境变量的方法
局部变量:某个函数执行过程,仅对局部代码生效
local Var_Name="Value"
位置参数变量:在脚本中引用传递给脚本的参数,在函数中引用传递给函数的参数
$1, $2, $3...$n
./script-name.sh 2 8
$0: 表示当前执行的进程名,script 本身的名字,或者在正则表达式中表示整行输出
$1: 传递给该shell脚本的第一个参数
$2: 传递给该shell脚本的第二个参数
$#: 位置参数的个数
$@: 引用所有的位置参数,将所有的位置参数分别显示
$*: 将所有的位置参数当做一个整体的字符串来显示
特殊变量:
$?: 上一条命令的执行状态;
状态用数字来表示:0-255;
0: 成功
1-255: 失败 (1、2、127 是系统预留的)
$!: 在后台运行的最后的工作的PID(进程ID).
$$: 脚本自身的进程ID.这个变量经常用来构造一个"unique"的临时文件名.
示例:
变量类型:
限定了数据的存储格式和数据的表示范围主要有
数值型:
整数、浮点数
文本型:
字符
bash中如何引用变量:
'' 强引用,变量替换不会进行
"" 弱引用,能够执行变量替换
`` 命令替换,引用命令的执行结果;命令替换的另外一符号:$(命令);
命令替换: $(COMMAND), 反引号:`COMMAND`
把命令中某个子命令替换为其执行结果的过程
echo "the current directory is /etc/sysconfig."
echo "the current directory is $(pwd)."
示例:
变量替换:
引用变量进行替换的标准形式为:${VAR_NAME},这里的花括号{}通常可以被省略。
变量替换还有一些其他的形式,可以应用于不同的场景:
${VAR_NAME:=word} 如果变量已经被赋值了,则显示原来的值,如果变量是空,则这里冒号后面的值不仅作为默认值,并且会保存在变量中。
示例:
${VAR_NAME:?word} 如果变量已经被赋值了,则显示原来的值,如果变量是空,或没有声明变量,则问号?后面的值会定向至标准错误输出
示例:
${VAR_NAME:-word} 如果没有定义变量或变量的值为空,则变量名后面用使用冒号加一个值,该值会作为变量的默认值使用;如果变量已经被赋值了,则冒号后的默认值不会替换原有的值。
示例:
${VAR_NAME:+word} 如果变量没有声明或值为空,则不作任何操作;如果变量已经赋值了,则用加号+后面的值会替换原来赋的值(仅时临时替换,不保存至变量)
示例:
如何查看shell中的变量:
查看所有变量:set
查看所有环境变量:env, printenv, export
What is shell Script
<<======================================【SHELL脚本】======================================>>
shell脚本:
shell脚本语言是弱类型语言
shell脚本是文本文件,简单说,脚本就是数条可执行语句的罗列。
运行脚本,事实上是运行一个bash进程,此进程负责从脚本文件中读取一个执行逻辑
执行脚本的几种方式:
1、bash scripts-name 或 sh scripts-name
2、PATH/script-name 或 cd到脚本所在目录 ./script-name
3、source script-name 或 .script-name
(用此方式执行可以把脚本中的变量和函数导入到当前shell中)
/etc/init.d/functions 函数:action
shebang:
几乎每一个可执行程序的初始位置都有一个 magic number(魔数),用来标识本程序的格式。
Linux上编译的程序无法在Windows上执行,是因为ABI(Application BinaryInterface:应用程序二进制接口)不兼容。通常在Linux上编译的程序采用的是ELF格式,使用file命令可查看文件的类型:
因此,shell脚本也需要指定具体的解释器,否则无法确定用什么解释器,从而会导致无法执行。
在编写脚本时,第一行会用来指定执行该脚本的解释器,增加的这一行在脚本语言中称为 shebang。
目的为告诉内核是否可以执行下面的内容。
shell脚本规范:
1、开头:shebang
2、版权等注释信息:
#Date
#Author
#Mial
#Function
#version
3、脚本中不要用中文注释
4、脚本文件以.sh为后缀
5、成对的符号和流程控制语句一次书写完,再添加内容,避免遗漏
6、通过缩进让代码易读
在面向过程的编程语言中,语言控制结构主要有以下三种:
顺序执行:默认法则,逐条执行各语句;
选择执行:分支,条件判断,符合条件的分支予以执行;不符合则略过;
循环执行:将同一段代码反复执行有限次,所以,循环必须有退出条件,否则将陷入死循环;