shell脚本基础知识以及变量

一、基础知识

1.shell脚本的格式注意事项 

  1. 第一行(一般必须写明):指定脚本使用的shell(若不写明也不影响脚本的执行,系统会自动以sh解析脚本)。"#!/bin/bash"声明文件内的语法使用bash的语法,当这个程序被执行时,加载bash的相关环境配置文件(一般是non-login shell中的~/.bashrc文件)。
  2. 第二部分的注释(可写):程序内容的说明。shell脚本中,井号#用作批注(除第一行的"#!"外),shell不会解释以#开头的行(除第一行bash声明外)。
  3. 主要环境变量的声明(可写)
  4. 脚本的程序部分。
  5. 程序执行结束,回传一个数值给系统告知执行的结果(可写。默认命令执行成功返回数值0)。
  6. shell脚本中,不能随意添加空格,否则出错:

    (1),=等号两边必须无空格。否则出错。如i =$1和i= $1都是错的。但是在()内部不限制如for ((i= 1;i < 3;i= i+1))是正确的。

    (2),(())内外部括号之间无空格,( () )这样报错。但内部括号内不限制,随便如s=$(( $i+1 ))可以

    (3),[]是条件判断式,所以前后内部都必须空格。其内部元素之间必须有空格才能识别,否则一律报错,如“while [ $i -lt 6 ]”少一个空格都报错。总之,[]所在行每个独立元素前后都必须有空格               (不是一起的就必须空格)。-gt,-lt,-ge,-le,-ne

          另外,单引号是字符串限定符,将内部内容作为字符串。而双引号和{}是变量限定符,内部作为变量处理

2.查看系统可用的shell(/etc/shells)

[root@linuxprobe ~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

 


3.shell脚本执行方式

  执行shell脚本的三种方式

  #sh scripts.sh 

  #/dir/scripts.sh   或者 ./scripts.sh      脚本得有执行权限。

  #source scripts.sh

二、变量

1.环境变量

  全局变量(环境变量):

  环境变量是一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如path,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程
环境变量:系统在启动过程中预先指定好的一系列的变量.比如当前用户是谁 当前shell是什么 当前用户的家目录在什么位置等等。set 查看所有变量(包括环境变量和非环境变量)

在Linux中,内置了一些环境变量,如HOME,PATH,SHELL,UID,GID,HOSTNAME等,可以通过命令env显示所有的环境变量,echo $变量名 输出变量。

  每个用户家目录下的环境变量配置文件:
  .bash_history 保存用户执行过来历史命令,当用户退出时保存
  .bash_logout 保存用户退出时执行的命令
  .bash_profile 保存用户定义环境和启动项目,用户执行命令时的搜索路径
  .bashrc 保存用户别名和函数
  .bash_profile 登录级别环境配置文件
  .bashrc shell级别的环境配置文件
  /etc/bashrc 全局shell级别环境配置文件
  /etc/profile 全局登录级别环境配置文件
  登录时加载的配置文件顺序
  /etc/profile
  .bash_profile
  .bashrc
  /etc/bashrc


  局部变量(普通变量):

  环境变量一般在脚本或命令中进行定义,只在当前的shell中有效,其他启动的shell这个变量是无效的。

2.预定义变量

  预定义变量:系统预定义好的 和进程名称 进程编号 进程参数 进程返回值相关

  预定义变量$0 $$ $# $? $*
  $0 进程名(如:/etc/init.d/network)
  $$ 进程号(/var/run 模拟系统结束进程)
  $# 位置参数的数量
  $* 所有位置参数的内容
  $? 命令执行后的返回状态.0为执行正确,非0为执行错误

3.位置变量:和命令行参数相关

  位置变量: 和命令行参数相关 (命令后跟的参数$1-$9)

4.自定义变量(用户自己定义的变量)

  自定义变量:当用户变量不够用时,自定义的变量

 

算式运算符:

  +、-、*、/、()
  1.$((5+3))
  2.$[ 5+3 ]
  3.expr操作符:
  +、-、\*、/、%取余(取模)
  expr 1 + 2
  4.
  a=1;b=2
  let c=$a+$b
  echo $c

shell通配符

  因为 shell 频繁 地使用文件名,shell 提供了特殊字符来帮助你快速指定一组文件名。这些特殊字符叫做通配符。

  通配符            意义

  *         匹配任意多个字符(包括零个或一个)
  ?         匹配任意一个字符(不包括零个)
  [characters]     匹配任意一个属于字符集中的字符
  [!characters]    匹配任意一个不是字符集中的字符
  [[:class:]]      匹配任意一个属于指定字符类中的字符

  

     字符类         意义

  [:alnum:]      匹配任意一个字母或数字
  [:alpha:]       匹配任意一个字母
  [:digit:]        匹配任意一个数字
  [:lower:]       匹配任意一个小写字母
  [:upper]       匹配任意一个大写字母

 

  一些常用的匹配:

  模式               匹配对象
  *               所有文件
  g*                文件名以“g”开头的文件
  b*.txt              以”b” 开头,中间有零个或任意多个字符,并以”.txt” 结尾的文件
  Data???                        以“Data”开头,其后紧接着 3 个字符的文件
  [abc]*                          文件名以”a”,”b”, 或”c” 开头的文件
  BACKUP.[0-9][0-9][0-9]      以”BACKUP.” 开头,并紧接着 3 个数字的文件
  [[:upper:]]*           以大写字母开头的文件
  [![:digit:]]*            不以数字开头的文件
  *[[:lower:]123]          文件名以小写字母结尾,或以“1”,“2”,或“3”结尾的文件         

shell元字符

  

字符 说明
IFS 由 <space> 或 <tab> 或 <enter> 三者之一组成(我们常用 space )。
CR 由 <enter> 产生。
= 设定变量。
$ 作变量或运算替换(请不要与 shell prompt 搞混了)。
> 重导向 stdout。 *
< 重导向 stdin。 *
| 命令管线。 *
& 重导向 file descriptor ,或将命令置于背境执行。 *
( ) 将其内的命令置于 nested subshell 执行,或用于运算或命令替换。 *
{ } 将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围。
; 在前一个命令结束时,而忽略其返回值,继续执行下一个命令。 *
&& 在前一个命令结束时,若返回值为 true,继续执行下一个命令。 *
|| 在前一个命令结束时,若返回值为 false,继续执行下一个命令。 *
! 执行 history 列表中的命令。*

  加入”*” 都是作用在命令名直接。可以看到shell 元字符,基本是作用在命令上面,用作多命令分割(或者参数分割)。因此看到与通配符有相同的字符,但是实际上作用范围不同。所以不会出现           混淆。

shell转义符

  有时候,我们想让 通配符,或者元字符 变成普通字符,不需要使用它。那么这里我们就需要用到转义符了。 shell提供转义符有三种。

字符 说明
‘’(单引号) 又叫硬转义,其内部所有的shell 元字符、通配符都会被关掉。注意,硬转义中不允许出现’(单引号)。
“”(双引号) 又叫软转义,其内部只允许出现特定的shell 元字符:$用于参数代换 `用于命令代替
\(反斜杠)   又叫转义,去除其后紧跟的元字符或通配符的特殊意义。

shell脚本基础知识以及变量

上一篇:源代码编译MYSQL5.6 环境下的MHA+KEEPALIVED的安装和维护


下一篇:arm-linux嵌入式 系统直接从SD卡启动运行