将要执行的命令按顺序保存到一个文本文件;
给该文件可执行权限;
可结合各种Shell控制语句以完成更复杂的操作。
Linux系统中的Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令
解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内
核执行,并输出执行结果。常见的Shell解释器程序有很多种,使用不同的Shell时,其内部指令、
命令行提示等方面会存在一些区别。
通过/etc/shells文件可以了解当前Linux系统所支持的Shell脚本种类
vim 1.sh #使用vim编辑器编写shell脚本
#!/bin/bash #脚本解释器声明
#输出hello #注释
echo "hello " #linux命令
#法一:指定路径的命令,要求文件必须有x权限
[root@localhost ~]#chmod +x /root/first.sh
[root@localhost ~]#cd /root/
[root@localhost ~]#./first.sh
当前目录位于:
/root
#法二:指定Shell来解释脚本,不要求文件必须有x权限。
[root@localhost ~]#bash first.sh
当前目录位于:
/root
#法三:source(.) 脚本路径执行shell脚本 不建议使用,source会修改当前环境
[root@localhost ~]#source first.sh
当前目录位于:
/root
#法四:将脚本文件放入$PATH中目录的其中一个目录,直接输入脚本名
echo $PATH
/usr/local/sbin: /usr/local/bin :/usr/sbin :/usr/bin: /rpot/bin
#法五:自己创建一个路径(将脚本文件所在的绝对路径添加至PATH中)
在/etc/profile文件最后添加:export PATH=$PATH:脚本所在的绝对路径
直接输入脚本名执行脚本
如果想要脚本全局运行(补全),需要将脚本放入echo $PATH路径下(shell脚本的本质是命令的集合,是一个程序)(需要有运行权限)
chmod +x /root/1.sh #给脚本添加可执行权限
指定绝对路径: /root/1.sh
指定相对路径: ./1.sh
bash(sh)执行脚本, 系统会创建一个子shell环境,并在这个子shell环境中执行这个脚本 ,脚本执行结束后系统就会自动退出bash环境
不建议使用source 与 . 执行脚本会在当前 shell 环境中执行脚本 影响当前环境
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
以下两个目录一般放自己创建或第三方应用程序生成的命令文件
/usr/local/sbin:只有管理员能执行的命令
/usr/local/bin :所有用户能够执行的命令
以下两个目录一般放系统自带或者系统生成的命令文件
/usr/sbin :只有管理员能执行的命令
/usr/bin: 所有用户能够执行的命令
/root/bin:不存在
将当前文件做个软连接放入或者使用cp复制到 /usr/local/bin目录下
直接输入脚本名执行脚本
在/etc/profile文件最后添加:export PATH=$PATH:脚本所在的绝对路径
直接输入脚本名执行脚本
总结:脚本错误常见的有三种区别
由于Shell脚本“批量处理”的特殊性,其大部分操作过程位于后台,不需要用户进行干预,因此要学会提取、过滤执行信息变得十分重要,所以我们需要重定向和管道。
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
重定向输出 | >> | 将输出结果换行添加在文件尾部 |
重定向错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
重定向错误输出 | 2>> | 将错误信息追加到指定的文件中 |
混合输出 | &>(无论对错都可以重定向) | 将标准输出、标准错误的内容保存到同一个文件中 |
示例1:重定向输入与输出修改密码
示例2:覆盖追加
#将12345678输入到文件log.txt中
[root@Zhuzi ~]#echo "12345678" > log.txt
[root@Zhuzi ~]#cat log.txt
12345678
[root@Zhuzi ~]#
#再将112234写入log.txt中,这个时候会覆盖原来的数据
[root@Zhuzi ~]#echo "112234" > log.txt
[root@Zhuzit ~]#cat log.txt
112234
[root@Zhuzi ~]#
#继续将112234写入log.txt中,使用>>,这个时候会追加原来的数据
[root@Zhuzi ~]#echo "112234" >> log.txt
[root@Zhuzit ~]#cat log.txt
112234
112234
管道符号 “|”,将左侧的命令输出结果,作为右侧命令的处理对象
选项 | 作用 |
-n | 不追加换行 |
-e | \b 退格 |
\c 抑制更多的输出 | |
\n 换行 | |
\t 横向制表符 |
|
\v 纵向制表符 |
echo -n
echo -e \b
echo -e \n
用来存放系统和用户需要使用的特定参数
①定义变量格式:变量名=变量值(shell中不用声明类型,所有类型均为字符串)
②定义变量时,变量名要求:
变量名区分大小写建议全部使用大写,不能使用系统内置变量。如$PATH是系统外部命令的存放
路径等。
变量名不能以数字开头,且不支持短横线 -。
①环境变量:系统维护的变量,用于设置工作环境,使用env命令可以查看所有环境变量
②只读变量:只可以读取不能修改的变量,相当于常量,用处较少
③自定义变量:用户自己定义的变量
④位置变量:通过命令行给脚本传递参数
主要指执行脚本时后面所跟着位置。
$1-$9:脚本后1-9的位置
${10}:脚本后10以上的位置需要借助变量分隔符{},不然会将$1认为是一个位置变量然后输出再加上后面的数字。
⑤预定义变量:系统已经定义好的变量,只需要记住即可
$*:表示所有位置参数的内容看成一个整体返回
$@:表示输出脚本后的所有位置参数,每个参数都是独立的个体
$0:表示脚本的文件名
$#:表示位置参数的总个数
$$: 当前bash的pid
$?: 代表上一次命令执行结果是否正确(0代表正确,非0代表不正确)
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所有子shell环境中可以继续使用
全局变量格式1: export 变量名
全局变量格式2:export 变量名=变量值
#!/bin/bash
read -p "请输入你要分区的设备:" disk
read -p "请输入你要分区的大小:" num
echo -e "n\n\n\n\n${num}\nw\n " |fdisk ${disk}
#!/bin/bash
read -p "输入第一个数" n1
read -p "输入第二个数" n2
read -p "输入第三个数" n3
expr $n1 \* $n2 + $n3 - $n1
想要随机产生1-32:$[RANDOM%32+1]
$[RANDOM%6]