《鸟哥私房菜》-第十二章-shell脚本

编程入门 行业动态 更新时间:2024-10-28 06:30:44

《鸟哥私房菜》-第<a href=https://www.elefans.com/category/jswz/34/1757164.html style=十二章-shell脚本"/>

《鸟哥私房菜》-第十二章-shell脚本

文章目录

      • shell脚本介绍
        • 脚本的编写和执行
          • 脚本的编写
          • 脚本的执行
      • shell脚本的练习
        • 交互式脚本
        • 数值计算
        • 判断式
          • 使用test命令
          • 使用判断符号[]
          • shell脚本的默认变量
        • 条件判断式
          • if…then
          • case…esac
          • function
        • 循环loop
          • 固定循环
          • 不定循环
        • shell脚本的跟踪与调试

在Linux中,shell脚本常用来帮助我们自动管理系统,但对于数值计算,shell脚本的效率较为低下

shell脚本介绍

shell脚本:利用shell功能所编写的一个程序,使用纯文本文件,将shell的命令写在里面,搭配以正则表达式、管道命令、数据流重定向等功能达到我们管理系统的目的。

脚本的编写和执行

脚本的编写
  • 在进行脚本文件(sh文件)的编写时,我们要注意一些事项:

    • shell脚本中的命令是从上而下、从左到右地分析和执行
    • 命令、选项、参数间的多个空格都会被忽略掉
    • 空白行也会被忽略掉
    • 如果读取到一个Enter(即CR),则开始该行或该串命令
    • 如果需要换行,则使用 \Enter,对enter进行转义,避免直接执行命令
    • # 之后的内容作为注释
  • 脚本的一般构成:

    • #!/bin/bash : 声明该shell脚本使用的shell名称
    • 程序内容的说明:内容功能、版本信息、作者及联系方式、文件日期、历史记录
    • 环境变量的声明与设置(使我们可以直接执行外部命令)
    • 程序部分:编写代码,实现功能
    • 返回执行结果:exit 0(exit 命令使程序中断,退出当前进程,并返回一个值给系统)

基于以上,我们首先要养成良好的编程习惯

脚本的执行

脚本的执行有多种方法:

  • 直接命令执行(即直接输入文件名即可),但需要 rx 权限
  • 绝对路径、相对路径执行,需要 rx 权限
  • 使用bash来执行,sh filename.sh ,需要 r 权限
  • source filename.sh,需要 r 权限

在这里我们需要区分一下使用bahs和source两种方式的区别:

当我们使用bash来执行脚本时,脚本会使用一个新的bash环境来执行,执行完毕后会自动退出该子bash,也就是说,在脚本中新建的变量只存在于子bash中,当脚本执行完毕,变量也会消失。

不同的是,当我们使用source命令时,是直接在当前bash中执行脚本,也就是说新建的变量会存在于当前bash中

shell脚本的练习

交互式脚本

我们可以使用 read实现用户与脚本的交互

read -p "please input a number" number
# 提示用户输入一个数字,存储在number这个变量中

数值计算

在shell中进行数值计算,有两种方式(但注意的是,在shell中只能进行整数间的计算,shell的数值计算功能比较low):

  • 使用declare命令

    declare -i total=${var1}*${var2} # 计算var1与var2的乘积
    
  • 使用 $((计算式))

    $((${var1}*${var2}))
    

判断式

使用test命令

test命令可以用来:

  1. 判断某个文件名的文件类型
  2. 检测文件的权限
  3. 比较两个文件
  4. 两个整数间的判断
  5. 判定字符串的数据(如是否为字符串,两字符串是否相同)
  6. 多重条件判定
test -e filename # 判断该文件名是否存在
使用判断符号[]

注意事项:

  • 中括号中每个组件间都需要用space分隔(包括中括号)
  • 在中括号中的变量,最好以双引号引起来
  • 在中括号中的常数,最好以单或双引号引起来

示例:

[ "${var1} == "${var2}" ] # 判断var1与var2是否相同,相同返回0
shell脚本的默认变量

我们知道在命令后面可以接不同的参数,以实现不同的功能。此外,在shell脚本文件名后也可以带有参数,实现不同的功能。

如: /etc/init.d/network restart # 重新启动/etc/init.d/network程序
  • Linux脚本针对参数设置了一些变量名称:
filename	opt1	opt2	opt3 ...
$0			$1		$2		$3	 ...	# $0代表文件名,$1代表参数一,$2代表参数二
此外:
- $#:代表参数总个数
- $@:代表"$1"$2"$3",即所有的参数内容
  • shift:参数变量号码偏移

    使用shift + 数字 代表拿掉最前面的几个参数的意思

条件判断式

if…then

在if…then中使用了判断式,来进行条件判断,语法如下:

if [ 条件判断式1 ]; then代码块1
elif [ 条件判断式2];	then代码块2
elif 代码块3
fi
case…esac

与c++中switch语句类似,语法如下:

case $变量名称in"第一个变量内容") 代码块1;;				# 代表一种情况的结束"第二个变量内容")代码块2;;*)				# 代表其他所有值代码块3;;
esac
function
  • function可以将一个功能封装起来,避免代码的冗余,语法如下:
function f_name() {代码块
}

值得注意的是:由于在shell中命令的执行是从上到下、从左到右,所以函数的定义一定要放到代码的最前面,避免使用时找不到定义的函数

  • function的内置变量

    函数名代表$0,后续的变量代表$1,$2….

循环loop

循环分为两种,一种是事先循环次数已知的循环,另外是事先循环次数未知

固定循环
  • while do done

    while [ condition ]
    do代码块
    done
    # 条件满足时,执行循环 
    
  • until do done

    until [ condition ]
    do代码块
    done
    # 直到条件满足,中止循环
    
不定循环
  • for do done

    for var in con1 con2 con3...
    do代码块
    done
    # var的值在con1、con2、con3中遍历
    
  • for do done 的数值处理

    for (( 初始值;限制值;赋值运算 ))
    do代码块
    done
    如:
    for (( i=1; i<=100; i++))
    doecho "print"
    done
    

shell脚本的跟踪与调试

shell脚本同样也可以先进行调试,再执行,需要使用sh命令

sh [-nvx] scripts.sh
-n :不执行脚本,仅检查语法问题
-v :执行脚本前,先将脚本文件的内容打印在屏幕上
-x :将使用到的脚本内容打印到屏幕上

常使用sh -x scripts.sh 来调试shell脚本

更多推荐

《鸟哥私房菜》-第十二章-shell脚本

本文发布于:2023-07-28 15:43:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1239056.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:十二章   私房   脚本   shell

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!