目录
1.shell脚本介绍
1.1什么是shell脚本
shell是linux和用户之间的桥梁,但虽然不是系统内核的一部分,但它调用了系统的大部分功能来执行程序、奖励文件和各个程序的运行。
shell有两种执行命令的方式
- 交互式:我们最常使用的模式,在命令终端输入一条命令,shell就去执行解释一条命令。
- 批处理:也就是shell脚本,把许多条命令集中在一个文件中,让shell一次性执行解释,不必一条一条的敲命令,他是一种弱类型语言,不需要事先定义数据类型。
1.2 shell脚本的构成
1.声明解释器
#!/bin/bash 默认的shell环境,可以根据不同的需求选择不同的环境
Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,习惯上把它们称作一种Shell。我们常说有多少种Shell,其实说的是Shell脚本解释器
2.注释信息
以#开始
注释信息一般包含
- 语句含义
- 作者信息
- 脚本完成日期等
3.可执行语句
也就是shell脚本中生效的语句
1.3 shell脚本执行方法
首先shell脚本作为一个命令集合文件,想要运行就必须要有执行权限,所有我们在执行脚本之前,一般会让文件获得执行权限,再让他执行,这也是一种执行脚本的方法。
方法一
chmod +x text.sh 赋予权限
./text.sh 执行脚本
注意,一定要写成 ./text.sh,而不是 text.sh,运行其它二进制的程序也一样,直接写 text.sh,linux 系统会去 PATH 里寻找有没有叫 text.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 text.sh 是会找不到命令的,要用 ./text.sh 告诉系统说,就在当前目录找。
如果我们不想赋予文件执行的权限,又想使用它,我们可以使用下面的方法来执行
方法二
bash ./text.sh
这个方法不用加权限就可以直接运行,他是指定shell的一种来执行脚本。
方法三
source ./text.sh
这个方法同样不需要执行权限就是可以执行,但这里并不建议使用这种方法,前面几种方法在运行脚本时会新开bash环境然后在其中运行,运行完毕之后退回到原来的环境,而这种方法会直接在当前的环境中执行脚本,可能会影响到当前的环境所以不建议使用。
方法四
把脚本文件放入环境变量的路径中
我们可以创建脚本的软链接文件指向其中的一个环境变量路径中
或者把当前路径加入到环境变量中
export PATH=$PAHT:路径
然后直接输入脚本名称就可以执行了
2.重定向
在了解重定向之前我们需要知道,什么是file description。
file description也就是文件描述符,在linux中,文件描述符有三种
类型 | 设备文件 | 文件描述符 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
结果信息的重定向需要配合文件描述符使用
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
标准输出追加 | >> | 将输出结果追加到指定的文件尾部 |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
标准错误追加 | 2>> | 标准错误输出结果追加到指定的文件尾部 |
混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
实例:
混合输出的另一种方法 首先将正确信息导入到1.txt文件中,再把错误信息导入到正确信息中
3.shell变量
3.1 变量作用
变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则。
3.2 定义变量的方法
变量名 = 变量值
要注意的是,shell脚本中,变量名的只能使用下划线和字符,字符区分大小写,并且不能和预留字段冲突
read -p “提示内容” 变量名
一种交互方式的变量定义方法,需要用户手动输入变量值
3.3 变量的类型
3.3.1 环境变量
环境变量也称为全局变量,可以在创建他们的Shell及其派生出来的任意子进程Shell中使用,环境变量又可以分为自定义环境变量和bash内置的环境变量,环境变量可以在命令行中设置和创建,用户退出命令行时这些变量值就会丢失,想要永久保存环境变量,可在用户家目录下的. bash_profile或. bashrc(非用户登录模式特有,如:SSH)文件中,或在/etc/profile文件中定义,这样每次用户登录时这些变量都将被初始化
几种不同的环境变量文件
- /etc/profile 系统每次启动时执行,全局有效
- /etc/bashrc 针对所有用户的,用户每切换一个shell环境都会自动执行
- /root/.bash_profile 不同用户登录系统会自动执行
- /root/.bashrc 当前用户每切换一个shell环境都会自动执行
3.3.2 只读变量
只读变量顾名思义,只可读不可修改
readonly 变量名 = 变量值
3.3.3 位置变量
在 Linux 的命令行中,当一条命令或脚本执行时,后面可以跟多个参数,我们使用位置参数变量来表示这些参数。其中,$0 代表命令行本身,$1 代表第 1 个参数,$2 代表第 2 个参数,依次类推。当参数个数超过 10 个时,就要用大括号把这个数字括起来,例如,${10} 代表第 10 个参数
例如
3.3.4 预定义变量
预定义变量即Shell已经定义的变量,用户可根据Shell的定义直接使用这些变量,无需自己定义。所有预定义的变量都由$符和其他符号组成,常用的预定义变量如下所示
-
$*:表示所有位置参数的内容看成一个整体返回
-
$@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回
-
$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
-
$#:表示命令行中位置参数的总个数
-
$0:表示当前执行的脚本或程序的名称 当前脚本的名字
-
$$:当前进程id
-
$!: 后台任务最后一个id
注意,$@和$*在不加引号时含义相同,表示位置参数的整体返回,加引号则含义不同
3.4 引号的使用
- 双引号:允许通过$符号应用其他变量值
- 单引号:禁止引用其他变量值,$视为普通符号
- 反撇好(`):命令替换,提取命令执行后的输出结果
注意:$()和反撇作用相同