初识shell脚本

244 阅读6分钟

1.认识shell脚本

1.1 Shell脚本概述

  • Shell脚本的概念
    • 将要执行的命令按顺序保存到一个文本文件
    • 给该文件可执行权限
    • 可结合各种Shell控制语句以完成更复杂的操作
  • Shell脚本应用场景
    • 重复性操作
    • 交互性任务
    • 批量事务处理
    • 服务运行状态监控
    • 定时任务执行

1.2 Shell的作用

  • Shell的作用---解释器,“翻译官”

于操作系统内核与用户之间,充当了一个“命令解释器"的角色,负责接收用户输入的操作指令(命令)并进行解释,Shell告诉操作系统的内核用户希望做什么,内核在通过cpu调度、内存管理、磁盘输入输出调动硬件。

Shell是个面向字符中的编程语言,可以跟Python之类的其他语言配合起来,比如某个复杂的功能使用一个Python脚本来实现, 然后在shell中调用这个脚本实现较复杂的功能:或者反过来,在Python脚本中调用外部的Shell脚木来提高自动化的效率,也是可以的。

image.png

  • 自动化运维
  • 批最化重复操作可以编写脚本结合计划任务自动周期运行
  • 减轻管理员工作量
  • 提高处理文本文件的速度
  • 避免配置出错
  • 用户的登录Shell
    • 登录后默认使用的Shell程序,一般为/bin/bash
    • 不同 Shell的内部指令、运行环境等会有所区别

1.2.1 Linux中有哪些shell?

检查一下/etc/shell文件,里面就是Linux所包含的Shell.

最常用的就是bash、tcsh、 cah、shnologin这些shell.这些shell都是依据linux发展者的不同所>创造出的不同版木。

  1. bash:基准于GNU的框架下发展出的Shell。
  2. csh:语法有点类似于c语言的Shell。
  3. tcsh:整合了csh,提供更多的功能。
  4. sh:已经被bash所替换。
  5. nologin:奇怪的shell,这个shell可以让用户无法登录主机。

注: bash (/bin/bash) 是目前大多数Linux版本采用的默认Shell

1.2.2 为什么系统上合法的Shell要写入/etc/shells这个文件呢?

这是因为系统某些服务运行过程中,会去检查用户能够使用的shell,而这些shell的查询就是借由/etc/shells这个文件。

1.2.3 用户什么时候可以取得shell工作?用户默认会取得哪一个shell?

当用户登录的时候,系统就会给一个shell让我来用。而这个登录取得的shell就记录在/etc/passwd这个文件内。

1.3 Shell编程规范

1.3.1 shell脚本的构成

  • 脚本申明(解释器) :若第一行为"!/bin/bash". 表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。还有其它类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect。

  • 注释信息:以开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。

  • 可执行语句:比如echo命令, 用于输出" "之间的字符申

1.3.2 编写第一个shell脚本

[root@localhost ~]# vim /root/test.sh
#!/bin/bash    //申明解释器
#This is my first Shell-Script   //脚本注释信息
cad /boot      //以下是代码块
echo"当前的目录位于:”
pwd
echo "其中以vml开头的文件包括:"
ls -lh vml*

1.3.3 Shell脚本的执行

  • 方法一:指定路径的命令,要求文件必须有x权限。

chmod +x /root/test.sh

指定绝对路径: /root/test.sh

指定相对路径: ./test.sh

  • 方法二:指定shell来解释脚木,不要求文件必须有x权限

bash或sh脚本路径:sh test.sh、bash test.sh

source或 . 脚木路径: . test.sh 、source test.sh

1.4 重定向

  • 交互式硬件设备
    • 标准输入:从该设备接收用户输入的数据
    • 标准输出:通过该设备向用户输出数据
    • 标准错误:通过该设备报告执行出错信息
类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出dev/stderr2显示器
  • 重定向操作
类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出>将输出结果保存到指定的文件(覆盖原有内容)
重定向输出>>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
标准错误输出2>>将错误信息追加到指定的文件中
混合输出&>将标准输出、标准错误的内容保存到同一个文件中
混合输出2>&1将标准错误输出重定向到标准输出
[root@localhost ~]# echo "123456" > pass.txt
[root@localhost ~]# passwd --stdin zhangsan < pass.txt    #从pass.txt 文件中取密码,需要注意SELinux 会影响此命令执行,若执行失败可尝试关闭SELinux

image.png

ls -lh > log.txt 2>&1   `等同于`    1s -lh &> log.txt

image.png

本来1-->屏幕 (1指向屏幕)

执行>1og后,1-->1og.txt(1指向log.txt)

执行2>&1后,2-->1 (2指向1,而1指向log.txt,因此2也指向了log.txt)

1.5 管道操作

将管道符号"|"左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。

[root@localhost ~]# ps aux | wc -l
[root@localhost ~]# echo "abc123"  | passwd --stdin zhangsan

image.png

2. Shell脚本变量

2.1 变量的作用、类型

2.1.1 变量的作用

用来存放系统和用户需要使用的特定参数(值)

  • 变量名:使用固定的名称,由系统预设或用户定义
  • 变量值:能够根据用户设置、系统环境的变化而变化

2.1.2 变量的类型

  • 自定义变量
    • 由用户自己定义:修改和使用
  • 特殊交量
    • 环境变量
    • 只读变量
    • 位置变量
    • 预定义变量

2.2 自定义变量

  • 定义一个新的变量
    • 变量名以字母或下划线开头,区分大小写,建议主大写

变量名=变最值

  • 查看变量的值

echo $变量名

[root@localhost ~]# name=can
[root@localhost ~]# echo $name

image.png

image.png

image.png

2.2.1 read命令输入内容

  • 方法一

read -p "提示信息" 变量名

echo $变量名

[root@localhost ~]# read -p "请输入一个变量的值:" name
[root@localhost ~]# echo $name

image.png

  • 方法二

echo -n "提示信息"。

read 变量名

echo $变量名

2.2.2 整数变量的运算

  • 常用运算符
方法符号
加法运算 +
减法运算 -
乘法运算\*
除法运算/
  • 整数运算
  1. expr 变量1 运算符 变量2 [运算符变量3]....

image.png

2. $((变量1 运算符 变量2))

image.png

3. $[变量1 运算符 变量2]

image.png

4. let 变量名=变量1 运算符 变量2

echo $变量名

image.png

i++  相当于  i-$[$i+1]
i--  相当于  i-$[$i-1]
i+=2 相当于  i=$[$i+2]
  • 浮点数运算
  1. echo "浮点数 运算符 浮点数" | bc

image.png

  1. awk 'BEGIN {print 浮点数 运算符 浮点数 }'

image.png

2.3 特殊变量

由用户自己定义、修改和使用

2.3.1 环境变量

环境变量由系统提前创建,用来设置用户的工作环境,使用env命令可以查看到当前工作环境下的环境变量

image.png

USER  表示用户名称
HOME  表示用户的宿主目录
LANG  表示语言和字符集
PWD   表示当前所在的工作目录
PATH  表示可执行程序的默认搜索路径
[root@localhost ~]# echo $PATH     #查看当前搜索路径
[root@localhost ~]# PATH="$PATH:/root"   #将/root目录添加到搜索路径
[root@localhost ~]# export PATH="$PATH:/root"  #输出为全局环境变量
[root@localhost ~]# source /etc/profile  #读取并执行文件中的设置

环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户。每个用户还有自己的独立配置文件(~/.bash_profile) 。可以用来长期变更或设置某个环境变量。

[root@localhost ~]# vim /root/.bash_profile
export HISTSIZE=200    #修改root用户的历史命令记录条数

2.3.2 只读变量

  • readonly命令设置只读变量
[root@localhost ~]# product = benet
[root@localhost ~]# readonly product    #设置为只读变量
[root@localhost ~]# product=accp        #只读变量不可以被重新赋值
[root@localhost ~]# unset product       #`只读变量不可以被删除,unset命令用于删除变量`

2.3.3 位置变量

当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字行串参数按照从左到右的顺序依次赋值给位置变量。

$n:n为数字,$0代表命令本身,$1-$9代表带个到第九个参数
`十以上的参数需要使用大括号表示,比如第十个多数为${10}`

[root@localhost ~]# vim addnum.sh
num1=$1
num2=$2
sum=$(($num1 + $num2) )
echo $sum
[root@localhost ~]# ./addnum.sh 1234  10 20

2.3.4 预定义变量

$*、$@:表示命令或脚本要处理的参数。
区别:
"$*":把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4""$@":把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回, 代表"$1" "$2" "$3" "$4"。

$0:表示当前执行的脚本或命令的名称。
$#:表示命令或脚本要处理的参数的个数。
$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。也常被用于Shell脚本中return退出函数并返回的退出值。
[root@localhost ~]#vim mybak.sh
#!/bin/bash
time=backup-`date +%F`.tar.gz
tar zcf $time $* &> /dev/null     #/`dev/nul1表示的是一个黑洞文件,通常用于丢弃不需要的数据输出`
echo "已执行$0脚本"
echo "共完成$#个对象的备份"
echo "具体内容包括: $*"
[root@localhost ~]# chmod +x mybak.sh
[root@localhost ~]# ./mybak.sh /etc/passwd /etc/shadow

image.png