目录标题
Shell脚本概述
- Shell是一个特殊的应用程序
它介于操作系统内核与用户之间,充当了一个"命令解释器"的角色,负责接收用户输入的操作指令,并进行解释,将需要执行的操作传递给内核执行,并采用默认shell - shell脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shell控制语句以完成更复杂的操作
- 脚本的构成
- 脚本申明(解释器):若第一行尾"#!/bin/bash",表示此行一下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。还有其它类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect
- 注释信息:以#开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行
- 可执行语句:比如echo命令,用于输出" " 之间的字符串
编写一个简单的Shell脚本
-
编写脚本代码
- 使用vim文本编辑器
- 每行一条Linux命令,按执行顺序依次编写
vim /root/simple.sh
#!/bin/bash
#This is a simple script
cd /var/log
echo “当前的目录位于:”
pwd
echo “其中以 m开头的文件包括”
ls -lh m*
-
Shell脚本的执行方法一:使脚本具有可执行属性
chmod +x /root/simple.sh
/root/simple.sh #可以绝对路径的方式执行
~/simple.sh #也可以相对路径的方式执行
-
方法一小结
我在脚本中写入了cd /var/log通过执行脚本后自己的所在路径不会发生改变。
因为使用的是shell脚本当中你的shell环境进行执行的而不是使用我当前的shell环境进行执行 -
Shell脚本的执行方法二:指定Shell来解释脚本,不要求文件必须有 x 权限
source 脚本路径:. simple.sh 或者 source simple.sh
-
Shell脚本的执行方法二:sh脚本文件路径
sh 脚本路径:sh simple.sh
-
执行脚本shell环境小总结
-
sh 或者加权限的方式执行脚本shell环境是脚本中的shell环境
-
. 或 source 执行脚本shell环境是通过当前环境执行的
重定向与管道操作
- 交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备箱用户输出数据
- 标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
- 重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出(覆盖) | > | 将输出结果保存到指定的文件 |
重定向输出(追加) | >> | 将输出结果追加到指定的文件尾部 |
标准错误输出(覆盖) | 2> | 将错误信息保存到指定的文件 |
标准错误输出(追加) | 2>> | 将错误信息追加到指定的文件中 |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
混合输出 | 2>&1 | 将标准错误输出重定向到标准输出 |
ls -lh > log.txt 2>&1 等同于 ls -lh &> log.txt
(将标准输出结果保存到指定的文件)
- 管道操作符号" | "
- 将左侧的命令输出结果,作为右侧命令的处理对象
- 管道符号可以配合xargs用法传递参数
Shell变量的作用、类型
- 变量的作用
- 用来存放系统和用户需要使用的特定参数(值)
- 变量名:使用固定的名称,由系统预设或用户自定义
- 变量值:能够根据用户设置、系统环境的变化而变化
- 变量的类型
- 自定义变量:由用户自定义、修改和使用
- 特殊变量:环境变量,只读变量,位置变量,预定义变量
自定义变量
- 定义一个新的变量
- 变量名以字母或下划线开头,区分大小写,建议全大写
- =是把右边的值赋值给左边的变量
- 查看变量的值
product=benet
version=6.0
name=“zhang san”
echo $product
echo $product $version
echo ${product}40
- 赋值时使用引号
双引号:允许通过$
符号引用其他变量值
单引号:禁止引用其他变量值,$
视为普通字符
反撇号:命令替换,提取命令执行后的输出结果与$()
一个作用
从键盘输入内容为变量赋值
read [-p “提示信息”] 变量名
-
方法一:
read -p “提示信息” 变量名
echo $变量名
-
方法二:
echo -n “提示信息”
read 变量名
echo $变量名
全局变量、局部变量
可以使用 pstree 命令查看Shell环境,输入 bash 命令进入子Shell环境,
按Ctrl+D组合键或输入 exit 命令退出子Shell环境
- pstree #查看当前shell环境
默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shell环境时,局部变量将无法再使用
- 全局变量
可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shell环境中能够继续使用
格式1:export 变量名
格式2:export 变量名=变量值
整数变量
- 整数变量的运算
- 常用运算符
- 加法运算:+
- 减法运算:-
- 乘法运算:*
- 除法运算:/
- 求模(取余)运算:%
- 常用的运算表达式
- i=$(expr 12 * 5)
- i=$((10 * 5))
- i=$[10 * 4]
- let i=10*3 #这种语法不需要空格
i++ 相当于 i=$[$i+1]
i-- 相当于 i=$[$i-1]
i+=2 相当于 i=$[$i+2]
特殊的Shell变量
环境变量
- 由系统提前创建,用来设置用户的工作环境
- 使用 env 命令可以查看到当前工作环境下的环境变量
- 配置文件:/etc/profile(全局变量的配置文件)、~/.bash_profile(当前用户的环境变量配置文件)
常见环境变量
PWD、PATH、USER、SHELL、HOME
变量USER表示用户名称
,HOME表示用户的宿主目录
,LANG表示语言和字符集
,PWD表示当前所在的工作目录
,变量PATH表示可执行程序的默认搜索路径
- echo $PATH #查看当前搜索路径
- PATH="$PATH:/root" #将/root目录添加到搜索路径
- export PATH="$PATH:/root" #输出为全局环境变量
- 已经将该目录添加到路径环境变量中,目录内的所有具有执行权限的文件,都可以在当前环境任何目录中执行
环境变量的全局配置文件为/etc/porfile,在此文件中定义的变量作用于所有用户。每个用户还有自己的独立配置文件(~/.bash_profile)可以用来长期变更或设置某个环境变量
- vim /root/.bash_profile
export HISTSIZE=200 #修改root用户的历史命令记录条数
echo $HISTSIZE
source /root/.bash_profile #读取并执行文件中的设置
echo $HISTSIZE
readonly命令设置只读变量
product=benet
readonly product #设置为只读变量
echo $product
product=accp #只读变量不可以背重新赋值
unset product #只读变量不可以被删除重启操作系统就没了,unset命令用于删除变量
位置变量
-
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量
-
$n:n为数字,$0代表命令本身,1~9代表第一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 ${10}
##预定义变量 -
$*、$@
:表示命令或脚本要处理的参数$*
:把所有参数看成以空格分隔的一个字符串整体(单字符串)反回,代表"$1 $2 $3 $4"$@
:把各个参数加上双引号分隔成n份的参数列表,每个参数是独立的。代表"$1" “$2” “$3” “$4”
-
$#
:命令或脚本要处理的参数个数
-
$?
:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
-
$0
:当前执行的脚本或命令的名称
vim num.sh
#!/bin/bash
time=backup-`date +%F`.tar
tar zcvf $time $* &> /dev/null #/dev/null表示的是一个黑洞文件,通常用于丢弃不需要的数据输出
echo "执行了 $0 脚本文件"
echo "一共完成了 $# 个文件的压缩"
echo "具体压缩的文件为:$*"
浮点运算
bash 不支持浮点运算,如果需要进行浮点运算,需要借助bc,awk处理
-
bc
-
awk