shell脚本

目录

1.认识shell脚本

1.1 Shell脚本概述

1.2 Shell的作用

1.2.1 Linux中有哪些shell?

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

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

1.3 Shell编程规范

1.3.1 shell脚本的构成

1.3.2 编写第一个shell脚本

1.3.3 Shell脚本的执行

1.4 重定向

1.5 管道操作

2. Shell脚本变量

2.1 变量的作用、类型

2.1.1 变量的作用

2.1.2 变量的类型

2.2 自定义变量

2.2.1 read命令输入内容

2.2.2 整数变量的运算

2.3 特殊变量

2.3.1 环境变量

2.3.2 只读变量

2.3.3 位置变量

2.3.4 预定义变量


1.认识shell脚本

1.1 Shell脚本概述

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

1.2 Shell的作用

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

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

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

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

1.2.1 Linux中有哪些shell?

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

最常用的就是bash、tcsh、 cah、sh、 nologin这些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/stdin 0 键盘
标准输出 /dev/stdout 1 显示器
标准错误输出 dev/stderr 2 显示器
  • 重定向操作
类型 操作符 用途
重定向输入 < 从指定的文件读取数据,而不是从键盘输入
重定向输出 > 将输出结果保存到指定的文件(覆盖原有内容)
重定向输出 >> 将输出结果追加到指定的文件尾部
标准错误输出 2> 将错误信息保存到指定的文件(覆盖原有内容)
标准错误输出 2>> 将错误信息追加到指定的文件中
混合输出 &> 将标准输出、标准错误的内容保存到同一个文件中
混合输出 2>&1 将标准错误输出重定向到标准输出
[root@localhost ~]# echo "123456" > pass.txt
[root@localhost ~]# passwd --stdin zhangsan < pass.txt    #从pass.txt 文件中取密码,需要注意SELinux 会影响此命令执行,若执行失败可尝试关闭SELinux
复制代码

ls -lh > log.txt 2>&1   `等同于`    1s -lh &> log.txt
复制代码

本来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
复制代码

2. Shell脚本变量

2.1 变量的作用、类型

2.1.1 变量的作用

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

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

2.1.2 变量的类型

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

2.2 自定义变量

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

变量名=变最值

  • 查看变量的值

echo $变量名

[root@localhost ~]# name=can
[root@localhost ~]# echo $name
复制代码

2.2.1 read命令输入内容

  • 方法一

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

echo $变量名

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

  • 方法二

echo -n "提示信息"。

read 变量名

echo $变量名

2.2.2 整数变量的运算

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

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

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

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

echo $变量名

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

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

2.3 特殊变量

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

2.3.1 环境变量

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

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
复制代码

你可能感兴趣的:(linux,bash,运维)