kevin0490 发表于 2018-8-23 08:16:19

shell简介及变量、脚本相关概念

  日期: 2015年09月13日
  shell、变量的概念
  What is 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进程
  定义变量: 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脚本是文本文件,简单说,脚本就是数条可执行语句的罗列。
  运行脚本,事实上是运行一个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、通过缩进让代码易读
  在面向过程的编程语言中,语言控制结构主要有以下三种:
  顺序执行:默认法则,逐条执行各语句;
  选择执行:分支,条件判断,符合条件的分支予以执行;不符合则略过;
  循环执行:将同一段代码反复执行有限次,所以,循环必须有退出条件,否则将陷入死循环;

页: [1]
查看完整版本: shell简介及变量、脚本相关概念