一、Shell脚本概述
1)Shell的作用——命令解释器,“翻译官”
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果
2)常见shell解释器
- /bin/bash:是目前大多数Linux 版本采用的默认shell
- /bin/sh:已经被bash替换
- /bin/csh:类似c语言的shell
- /bin/tcsh:整合了csh提供了更多功能
- /bin/nologin:这个shell可以让用户无法登录
3)编程语言类型
面向对象 JAVA PYTHON C++ C# GO
面向过程 C Shell
强类型语言 JAVA C C++ C# GO 编译型语言,执行钱需要先编译,允许速度快
弱类型语言 PYTHON Shell PHP 解释型语言,不需要编译即可直接执行,常用与脚
4)Shell脚本
提前将可执行的命令语句写入一个文件,顺序执行,解释器逐行解释代码
编写脚本代码
- 使用vim文本编辑器
- 每行一条Linux命令,按执行顺序依次编写
Shell脚本的构成
- 脚本申明(解释器):若第一行为 "#!/bin/bash” ,表示此行以下的代码语句是通过 /bin/bash程序来执行,#!/bin/bash 为默认解释器。还有其他类型的解释器,比如 #! /usr/bin/python、 #!/usr/bin/expect
- 注释信息:以 "#" 开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行
- 可执行语句:比如 echo 命令,用于输出" "之间的字符串
[root@localhost ~]# vim first.sh
#!/bin/bash
#this is first shell
echo "HelloWorld"
赋予可执行权限
- 使脚本具有可执行属性
[root@localhost ~]# chmod +x first.sh
Shell脚本的执行方法
1)绝对/相对路径指定脚本文件运行,需要执行用户拥有执行权限x,脚本会在子shell环境中运行
2)用bash/sh 程序执行脚本文件运行,不需要执行权限,脚本会在子shell环境中运行
3)用source/.指定脚本文件运行,脚本会在当前shell环境中运行(会影响当前所在目录、变量的值 等因素)
5)重定向与管道操作
交互式硬件设备
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
重定向操作
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息追加到指定的文件中(覆盖原有内容) |
2>> | 将错误信息追加到指定的文件中 | |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
2>&1 | 将标准错误输出重定向到标准输出 |
管道操作符号“|”
- 将左侧的命令输出结果,作为右侧命令的处理对象
cmd1 | cmd2 [……|cmdn]
[root@localhost ~]# grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
teacher:x:500:500:BENET Linux Teacher:/home/teacher:/bin/bash
[root@localhost ~]grep "bash$" /etc/passwd | awk -F: '{print $1,$7}'
#以冒号:分割,输出第1、7个字段
root /bin/bash
teacher /bin/bash
二、Shell脚本变量
1)Shell变量的作用、类型
变量的作用
用来存放系统和用户需要使用的特定参数(值)
- 变量名:使用固定的名称,由系统预设或用户定义
- 变量值:能够根据用户设置、系统环境的变化而变化
变量的类型
自定义变量:由用户自已定义、修改和使用
特殊变量:环境变量,只读变量,位置变量,预定义变量
2)自定义变量
定义一个新的变量
变量名以字母或下划线开头,区分大小写,建议全大写
变量名=变量值
查看变量的值
echo $变量名
[root@localhost ~]# Product=Python
[root@localhost ~]# Version=2.7.13
[root@localhost ~]# echo $Product
Python
[root@localhost ~]# echo $Product $Version
Python 2.7.13
赋值时使用引号
双引号:会把$当作特殊符号去引用变量的值
单引号:禁止引用其他变量值,会把$等特殊符号是为普通字符去使用
反撇号:命令替换,获取里面的命令执行后的输出结果,`……`效果等同于$()
从键盘输入内容为变量赋值
read [-p “提示信息”] 变量名
设置变量的作用范围
#两种格式可以混合使用
格式1:export 变量名 …
格式2:export 变量名=变量值 …
[root@localhost ~]# echo "$Product $Version"
Benet 6.0
[root@localhost ~]# export Product Version #导出为全局变量
[root@localhost ~]# bash
[root@localhost ~]# echo "$Product $Version" #子程序引用全局变量
Benet 6.0
[root@localhost ~]# exit
永久全局变量添加
[root@localhost ~]# vim /etc/profile
#最后一行加入
export Product Version
[root@localhost ~]# source /etc/profile #当前环境立即执行,也可以重启
[root@localhost ~]# echo "$Product $Version"
Benet 6.0
[root@localhost ~]# bash #切换shell环境
[root@localhost ~]# echo "$Product $Version"
Benet 6.0
整数变量的运算
expr 变量1 运算符 变量2 [运算符 变量3]…
常用运算符
加法运算:+
减法运算:-
乘法运算:\*
除法运算:/
求模(取余)运算:%
let命令
let是一个用于执行算术运算的命令。它可以将一个算术表达式作为参数,并将其计算结果赋值给一个变量。let命令支持的算术运算包括加、减、乘、除、取模等
3)特殊的Shell变量
环境变量
- 由系统提前创建,用来设置用户的工作环境
- 配置文件:/etc/profile、~/.bash_profile
常见的环境变量
- PATH:指定可执行程序的搜索路径
- HOME:指定当前用户的家目录
- LANG:指定当前系统的语言环境
- SHELL:指定当前Shell的路径
- PS1:指定Shell提示符的格式
- PWD:指定当前工作目录
- TERM:指定当前终端的类型
- USER:指定当前用户的用户名
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin
[root@localhost ~]# PATH="$PATH:/root"
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin:/root
只读变量
- 用于变量值不允许被修改的情况
[root@localhost ~]# name=cloud
[root@localhost ~]# readonly name //设置为只读变量
[root@localhost ~]# echo $name
cloud
[root@localhost ~]# name=yum
-bash:name:readonly variable //只读变量不可以被重新赋值
[root@localhost ~]#
[root@localhost ~]# unset name //只读变量不可以被删除
-bash:unset:name:cannot unset:readonly variable
位置变量
- 表示为$n,n为1~9之间的数字
[root@localhost ~]# ./myprog.sh one two three four five six
↑ ↑
$1,第1个位置参数 ↑
$6,第6个位置参数
预定义变量
[root@localhost ~]# vim mybak.sh
#!/bin/bash
TARFILE=beifen-`date +%s`.tgz
tar zcf $RARFILE $* &> /dev/null
echo "已完成$0脚本,"
echo "共完成$#个对象的备份"
echo "具体内容包括:$*"
[root@localhost ~]# chmod +x mybak.sh
[root@localhost ~]# ./mybak.sh /etc/passwd /etc/shadow
已执行 ./mybak.sh 脚本,
共完成2个对象的备份
具体包括:/etc/passwd /etc/shadow