shell脚本编程基础

★ 编程基础
★ 脚本基本格式
★ 变量
★ 运算
★ 条件测试
★ 配置用户环境
一.编程基础
  程序:指令+数据
  程序编程风格:
      过程式:以指令为中心,数据服务于指令
      对象式:以数据为中心,指令服务于数据
  shell程序:提供了编程能力,解释执行
 1.程序的执行方式
   计算机:运行二进制指令
   编程语言:
       低级:汇编
       高级:
             编译:高级语言–编译器–目标代码
                         java,C#
             解释:高级语言–解释器–机器代码
                         shell,perl,python
 2. 编程的基本概念
    ▶ 编程逻辑处理方式:
           顺序执行
           循环执行
           选择执行
    ▶  shell编程:过程式、解释执行
        编程语言的基本结构:
              各种系统命令的组合
              数据存储:变量、数组
              表达式:a + b
        语句:if
二.脚本基本格式
▶ shell脚本基础
    shell 脚本:包含一些命令或声明,并符合一定格式的文本文件
    格式要求:首行shebang 机制
    #!/bin/bash
    #!/usr/bin/python
    #!/usr/bin/perl
     shell 脚本的用途有:
     1.自动化常用命令

     2.执行系统管理和故障排除

     3.创建简单的应用程序

     4.处理文本或文件
▶ 创建shell脚本
第一步:使用文本编辑器来创建文本文件
• 第一行必须包括shell 声明序列:#!
 #!/bin/bas
• 添加注释
注释以# 开头
第二步:运行脚本
• 给予执行权限,在命令行上指定脚本的绝对或相对路径
• 直接运行解释器,将脚本作为解释器程序的参数运行
▶ shell脚本示例
#!/bin/bash
#Author: wang
#Version: 1.0
#Date: 2016-05-01
#Description:The script displays system information
echo “Greetings. The date and time are $(date)”
echo “Your working directory is: $(pwd)”
▶ 脚本调试
• 检测脚本中的语法错误
  bash -n /path/to/some_script
• 调试执行
  bash -x /path/to/some_script
三 变量
▶ 变量:命名的内存空间
     数据存储方式:
       字符:
       数值:整型,浮点型
▶ 变量:变量类型
   作用:
   1、数据存储格式
   2、参与的运算
   3、表示的数据范围
   类型:
       字符
       数值:整型、浮点型
▶ 强类型:定义变量时必须指定类型、参与运算必须符合类型
▶ 要求:调用未声明变量会产生错误
    如 java,c
▶ 弱类型:无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用
如:bash  不支持浮点数,python
    变量命名法则:
1、不能使程序中的保留字:例如if, for
2、只能使用数字、字母及下划线,且不能以数字开头
3、见名知义
4、统一命名 规则:驼峰命名
▶ bash中变量的种类
根据变量的生效范围等标准:
本地变量:生效范围为当前shell 进程;对当前shell 之外的其它shell 进程,包括当前shell 的子shell 进程无效
环境变量:生效范围为当前shell 进程及其子进程
局部变量:生效范围为当前shell 进程中某代码片断( 通常指函数)
位置变量:$1, $2, … 来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
特殊变量:$?, $0, $*, $@, $#,$$
▶ 本地变量
变量赋值:name=‘value’
可以使用引用value:
(1)可以是直接字串;name=“root”
(2)变量引用:name=”$USER”
(3)命令引用:name=COMMAND name =$(COMMAND)
变量引用:${name} $name
“” :弱引用,其中的变量引用会被替换为变量值
” :强引用,其中的变量引用不会被替换为变量值,而保持原字符串
显示已定义的所有变量:set
删除变量:unset name
▶ 环境变量
     变量声明、赋值:
     export name=VALUE

     declare -x name=VALUE

      变量引用:$name, ${name}

      显示所有环境变量:
       export
       env
       printenv
删除:unset name
bash 有许多内 建的环境变量:PATH, SHELL, USRE,UID,HISTSIZE, HOME, PWD, OLDPWD, HISTFILE
▶ 只读和位置变量
只读变量:只能声明, 但不能修改和删除
     声明只读变量:
     readonly name
     declare -r name
     查看只读变量:
     readonly –p
位置变量:在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, … :对应第1、2第2 等参数,shift [n] 换位置
$0: 命令本身
$*: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
    $@ $* 只在被双引号包起来的时候才会有差异
set — 清空所有位置变量
四 算术运算
bash 中的算术运算:help let
    +, -, *, /, % 取模(取余), ** (乘方)
实现算术运算:
(1) let var= 算术表达式
(2) var=$[ 算术表达式]
(3) var=$(( 算术表达式))
(4) var=$(expr arg1 arg2 arg3 …)
(5) declare –i var =  数值
(6) echo‘算术表达式’| bc
乘法符号有些场景中需要转义 ,如 如
bash 有内建的随机数生成器:$RANDOM (1-32767) )
       echo $[$RANDOM%50]:0-49之间随机数
▶ 增强型赋值:
    +=, -=, *=, /=, %=
let varOPERvalue
例如:let count+=3
    自加3 后自赋值
    自增,自减:
    let var+=1
    let var++
    let var-=1
    let var–
 ▶ 逻辑运算
 非:!
   !1=0
   !0=1
  短路运算:
    短路与:
    第一个为0,结果必定为0
    第一个为1,第二个必须要参与运算
  短路或:
    第一个为1,结果必定为1
    第一个位0,第二个必须要参与运算
  异或:^
    异或的两个值,相同为假,不停同为真
▶ 退出状态码
bash 自定义退出状态码
exit [n] :自定义退出 状态码
注意:脚本中一旦遇到exit 命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
五 条件测试
判断某需求是否满足,需要由测试机制 来实现
专用的测试表达式需要由测试命令辅助完成 测试过程
评估布尔声明,以便用在条件性执行中
• 若真,则返回0
• 若假,则返回1
   测试命令:
• test EXPRESSION
• [ EXPRESSION ]
• [[ EXPRESSION ]]
注意:EXPRESSION 前后必须有空白字符
▶ 条件性的执行操作符
根据退出状态而定,命令可以有条件地运行
• && 代表条件性的AND THEN
• || 代表条件性的OR ELSE
  例如:
$ grep -q no_such_user /etc/passwd || echo ‘No such user’
No such user
$ ping -c1 -W2 station1 &> /dev/null  && echo “station1 is up”  || (echo ‘station1 is unreachable’; exit 1)
station1 is up
▶ test 命令
长格式的例子:
$ test “$A” == “$B” && echo “Strings are equal”
$ test “$A” -eq “$B” && echo “Integers are equal”
  简写格式的例子:
$ [ “$A” == “$B” ] && echo “Strings are equal”
$ [ “$A” -eq “$B” ] && echo “Integers are equal”
▶ bash类型的测试
数值测试
     -gt: 是否大于
     -ge: 是否 大于等于
     -eq: 是否等于
     -ne: 是否 不等于
     -lt: 是否小于
     -le: 是否 小于等于
字符串测试:
   ==:是否等于;
   >: ascii 码是否大于ascii码 
   <:  是否小于
   !=:  是否不等于
   =~:  左侧字符串是否能够被右侧的PATTERN所匹配
注意: 此表达式一般用于[[ ]] 中;扩展的正则表达式
   -z “STRING” :字符串是否为空,空为真,不空为假
   -n “STRING” :字符串是否不空,不空为真,空为假
注意:用于字符串比较时的用到的操作数都应该使用引号
▶ 文件测试
  存在性测试
    -a FILE :同-e
    -e FILE:  文件存在性测试,存在为真,否则 为假
  存在性及类别测试
    -b FILE :是否存在且为块 设备文件
    -c FILE :是否存在且为字符 设备文件
    -d FILE :是否存在且为 目录文件
    -f FILE :是否存在且为 普通文件
    -h FILE 或 或 -L FILE :存在且为符号 链接文件
    -p FILE :是否存在且为命名 管道文件
    -S FILE :是否存在且为套接
  文件权限测试:
    -r FILE :是否存在且可读
    -w FILE:  是否存在且可写
    -x FILE:  是否存在且可执行
  文件特殊权限测试:
    -u FILE :是否存在且拥有suid 权限
    -g FILE :是否存在且拥有sgid 权限
    -k FILE :是否存在且拥有sticky
  文件大小测试:
    -s FILE:  是否存 在 且 非空
  文件是否打开:
    -t fd: fd 表示文件描述符是否已经打开且与某终端相关
    -N FILE :文件自动上一次被读取之后是否被修改过
    -O FILE :当前有效用户是否为文件属主
    -G FILE
  双目测试:
    FILE1 -ef FILE2: FILE1 与FILE2 是否指向同一个设备上的相同inode
    FILE1 -nt FILE2: FILE1 是否新于 于FILE2
    FILE1 -ot FILE2: FILE1 是否旧于 于FILE2
▶ 组合测试条件
  第一种方式:
   COMMAND1 && COMMAND2  并且
   COMMAND1 || COMMAND2  或者
   ! COMMAND 非 非
如:[[ -r FILE ]] && [[ -w FILE ]]
  第二种方式:
  EXPRESSION1 -a EXPRESSION2  并且
  EXPRESSION1 -o EXPRESSION2  或者
  ! EXPRESSION
必须使用测试命令 进行;
   示例:
     # [ -z “$HOSTNAME” -o $HOSTNAME “==”localhost.localdomain” ] && hostname www.magedu.com
     # [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
六 配置用户环境
▶ 使用read命令来接受输入
     使用read 来把输入值分配给一个或多个shell 变量:
     -p 指定要显示的提示
     -s 静默输入
     -n N 指定输入的字符长度N
     -d ‘字符’ 输入结束符
     -t N TIMEOUT 为N秒 秒
read 从标准输入中读取值,给每个单词分配一个变量,所有剩余单词都被分配给最后一个变量
read -p “Enter a filename: “ FILE
▶ bash如何展开命令行
    •把命令行分成单个命令词
    •展开别名
    •展开大括号种的声明({}) )
    •展开波浪符声明(~) )
    •命令替换$() 和 “)
    •再次把命令行分成命令词
    •展开文件通配(
、? 、[abc] 等等)
    •准备I/0 重导向(< 、>) )
    •运行命令
▶ 防止扩展
   反斜线(\ )会使随后的字符按原意解释
   $ echo Your cost: \$5.00

   Your cost: $5.00

   加引号来防止扩展

    • 单引号(’ )防止所有扩展
    • 双引号(” )也防止所有扩展,但是以下情况例外:
     $(美元符号) - 变量扩展
   `(反引号) - 命令替换

   \(反斜线) - 禁止单个字符扩展

   !(叹号) - 历史命令替换

▶ bash的配置文件
  按生效范围划分,存在两类:
   全局配置:
   /etc/profile
   /etc/profile.d/.sh
   /etc/bashrc
    个人配置:
   ~/.bash_profile
   ~/.bashrc
▶ shell登录两种方式
交互式登录:
 (1) 直接通过终端输入账号密码登录;
 (2) 使用“su – UserName”  切换的用户
执行顺序:
/etc/profile –> /etc/profile.d/
.sh –>/.bash_profile –> ~/.bashrc –> /etc/bashrc
非交互式登录:
(1)su UserName
(2) 图形界面下打开的终端
(3) 执行脚本
执行顺序:
~/.bashrc –> /etc/bashrc –> /etc/profile.d/.sh
▶ Profile类
按功能划分,存在两类:
   profile 类和bashrc类 
 profile 类:为交互式登录的shell 提供配置
   全局:/etc/profile, /etc/profile.d/
.sh
   个人:~/.bash_profile
   功用:
   (1)用于定义环境变量
   (2)运行命令或脚本 
▶ Bashrc类
 bashrc 类:为非交互式和交互式登录的shell 提供配置
  全局:/etc/bashrc
  个人:~/.bashrc
  功用:
  (1)定义命令别名和函数
  (2)定义本地变量
▶ 编辑配置文件生效
修改profile 和bashrc 文件后需生效
两种 方法:
1 重新启动shell 进程
2 .或source
  例:
   . ~/.bashrc
▶ Bash 退出任务
保存在~/.bash_logout 文件中(用户)
在退出登录shell 时运行
用于
• 创建自动备份
• 清除临时文件

原创文章,作者:xialingfeng,如若转载,请注明出处:http://www.178linux.com/72047

(0)
上一篇 2017-03-28 09:55
下一篇 2017-03-28 12:23

相关推荐

  • Ansible Conditionals & Loops

     一、条件语句     条件判断语句,就是根据某些变量的值来控制Ansible的执行流程。控制某些主机执行某些操作与不执行某些操作。根据某些操作结果,判断是否执行其它操作等等。     Ansible的条件判断语句只有 when 语句,结合变量使用才能显示出它的价值。when的用…

    Linux干货 2015-11-21
  • example:Disk and LVM

    1、创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/test目录,且默认有acl挂载选项。     1)创建磁盘分区 [root@localhost ~]# fdisk /dev/sdb    Device conta…

    Linux干货 2016-08-29
  • raid5创建

    创建分区并改类型 创建raid5   创建把文件系统 生成配置文件    

    2017-12-17
  • LINUX命令历史

    LINUX命令历史 LINUX的命令历史是什么? linux的命令历史的作用是,记录执行过的命令。如果你经常使用 Linux 命令行,那么使用 命令历史可以有效地提升你的效率。history(管理历史命令)语法:[root@localhost]#history(选项)(参数)选项:n:n为数字,要列出最近的 n 笔命令列表-c(清空所有历史命令)-d (删除…

    2017-09-14
  • N25-第二周博客作业

    1. Linux上的文件管理类命令都有那些,其常用的使用方法及其相关示例演示. 文件管理工具有cp, mv, rm cp命令: 复制文件或文件夹 语法: cp [OPTION]… [-T] SOURCE DEST 单源复制cp [OPTION]… SOURCE… DIRECTORY 多源复制 常用选项:  &nb…

    Linux干货 2016-12-10
  • 关于 LVM 逻辑卷管理

                  逻辑卷管理 (LVM)    允许对卷进行方便操作的抽象层,包括从新设定文件系统的大小   允许在多个设备间重新组织文件系统将设备指定为物理卷用一个或者多个物理卷来创建一个卷组物理卷是用固定大小的物理区…

    系统运维 2016-09-02