AI智能
改变未来

构建基础shell脚本

大二的时候学了shell脚本编程,这在后来的Linux系统的使用中给了我很大的帮助,它能让我更加快捷的完成一些工作。这也是一个对shell编程细节部分的复习系列,参考到了《Linux命令行与shell脚本编程大全 第3版》,当年我用到的还是第2版,时间过得真快呀。

一,一个简单的脚本是怎样运行起来的

1,创建一个空文件:

2,编写脚本内容:

  • 第二行以#开头,表示是一个注释,不会被执行。
  • 第一行#后面的惊叹号告诉shell用哪个shell来运行脚本。

3,修改文件权限:

  • 必须拥有权限才能运行。

4,在当前目录运行脚本:

  • 在脚本所在目录运行脚本用./脚本名。
  • 在所有目录都能运行脚本,需将脚本所在目录加入PATH变量。

通过这么一个简单的脚本,我们就能获得执行多条shell命令才能获得的效果,而且定制化程度还很高,它让我们能快速地执行一系列操作和获得所需的内容,这就是shell脚本的优势。

二,构建脚本

1,添加自己的文本消息来告诉脚本用户脚本正在做什么,通过echo命令来实现

1,echo语句添加到shell脚本中任何需要显示额外信息的地方:


2,使用-n将文本与命令输出显示在同一行中:

2,使用变量

1,使用环境变量:

  • 变量名称之前加上美元符( $)来使用这个变量。
  • echo命令中的环境变量会在脚本运行时替换成当前值。
  • 使用美元符号,要用 \\ 转义。

2,使用用户变量:

3,从命令输出中提取信息,并将其赋给变量:

  • 法一:testing=‘date’
  • 法二:testing=$(date)

today变量是被赋予格式化后的date命令的输出。这是提取日期信息来生成日志文件名常用的一种技术。+%y%m%d格式告诉date命令将日期显示为两位数的年月日的组合。

3,重定向输入和输出

可以将命令的输出重定向到另一个位置(比如文件)。重定向可以用于输入,也可以用于输出,可以将文件重定向到命令输入。

1,输出重定向:command > outputfile

  • 追加重定向 command >> outputfile

2,输入重定向:command < inputfile

  • wc命令可以对对数据中的文本进行计数:文本的行数、文本的词数、文本的字节数。

4,管道

将一个命令的输出作为另一个命令的输入的过程,叫管道连接(piping):command1 | command2。
可以在一条命令中使用任意多条管道。可以持续地将命令的输出通过管道传给其他命令来细化操作:

也可以搭配使用重定向和管道来将输出保存到文件中。

5,执行数学运算

执行数学运算的能力对任何编程语言都很重要的,但在shell中就必见不方便,需要两种命令的辅助。
1,expr命令:
ARG1 | ARG2 如果ARG1既不是null也不是零值,返回ARG1;否则返回ARG2
ARG1 & ARG2 如果没有参数是null或零值,返回ARG1;否则返回0
ARG1 < ARG2 如果ARG1小于ARG2,返回1;否则返回0
ARG1 <= ARG2 如果ARG1小于或等于ARG2,返回1;否则返回0
ARG1 = ARG2 如果ARG1等于ARG2,返回1;否则返回0
ARG1 != ARG2 如果ARG1不等于ARG2,返回1;否则返回0
ARG1 >= ARG2 如果ARG1大于或等于ARG2,返回1;否则返回0
ARG1 > ARG2 如果ARG1大于ARG2,返回1;否则返回0
ARG1 + ARG2 返回ARG1和ARG2的算术运算和
ARG1 – ARG2 返回ARG1和ARG2的算术运算差
ARG1 * ARG2 返回ARG1和ARG2的算术乘积
ARG1 / ARG2 返回ARG1被ARG2除的算术商
ARG1 % ARG2 返回ARG1被ARG2除的算术余数
STRING : REGEXP 如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配
match STRING REGEXP 如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配
substr STRING POS LENGTH 返回起始位置为POS(从1开始计数)、长度为LENGTH个字符的子字符串
index STRING CHARS 返回在STRING中找到CHARS字符串的位置;否则,返回0
length STRING 返回字符串STRING的数值长度

  • TOKEN 将TOKEN解释成字符串,即使是个关键字
    (EXPRESSION) 返回EXPRESSION的值

    2,使用方括号
    方括号比expr命令更加优雅:在将一个数学运算结果赋给某个变量时,可以用美元符和方括号( $[ operation ])将数学表达式围起来:

但还是有个大问题:bash shell数学运算符只支持整数运算。若要进行任何实际的数学计算,这是一个巨大的限制。
3,浮点运算
最常见的方案是用内建的bash计算器,叫作bc:variable=$(echo “options; expression” | bc)

在一个命令行中列出多个表达式进行大量运算,就会有点麻烦,但可以:

6,完美地退出脚本
shell中运行的每个命令都使用退出状态码( exit status)告诉shell它已经运行完毕。
对shell脚本而言,运行完最后一条命令时,脚本就结束了。同样地,在命令结束运行时一个状态码由命令传给shell,可以捕获这个值并在脚本中使用,让脚本的退出更加优雅。
$?变量能让我们查看退出状态码:

  • 0 命令成功结束
  • 1 一般性未知错误
  • 2 不适合的shell命令
  • 126 命令不可执行
  • 127 没找到命令
  • 128 无效的退出参数
  • 128+x 与Linux信号x相关的严重错误
  • 130 通过Ctrl+C终止的命令
  • 255 正常范围之外的退出状态码

至此,可以定制你自己的shell脚本了,特别是一些信息的组合输出与记录型的操作,都可以由你的脚本来完成啦,想要向脚本内添加更多的执行逻辑,可以看下一篇。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 构建基础shell脚本