文章目录
Shell脚本
Shell脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shelll控制语句以完成更复杂的操作
Shell脚本可以做什么
- 自动化完成软件的安装部署,如安装部署LAMP架构服务
- 自动化完成系统的管理,如批量添加用户
- 自动化完成备份,如数据库定时备份
- 自动化的分许处理,如网站访问量
Shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事物处理
- 服务运行状态监控
- 定时任务执行
- ……
4 2 1=r w x
shell nologin 用户无法登陆
一句话:需要完成大量复杂、重复性的工作室,不需要在命令行重复执行命令,直接运行 shell 脚本即可,节约了大量的时间,也提高了效率。
Shell的作用
Shell的作用——命令解释器,“翻译官”
- 介于系统内核与用户之间,负责解释命令行
用户的登录Shell
- 登录后默认使用的Shell程序,一般为/bin/bash
- 不同Shell的内部指令、运行环境等会有所区别
编写第一个Shell脚本
编写脚本代码
- 使用vim文本编辑器
- 每行一条Linux命令,按执行顺序一次编写
赋予可执行权限
- 使脚本具有可执行属性
创建shell 程序步骤
:
1、创建一个包含命令和控制结构的文件(定义;声明)(依次编写的命令)
2、编辑完后修改文件的权限,使它可以执行
3、检测出语法错误(命令集合是否正确;控制语句)
4、执行自己的脚本 ./dome.sh
执行脚本文件
方法一:脚本文件路径(绝对路径与相对路径)
[root@ky19 ~]# ./dart.sh
方法二:sh 脚本文件路径
[root@ky19 ~]# sh dart.sh
方法三:source脚本文件路径
[root@ky19 ~]# source dart.sh
需要在当前目录下使用
.dart.sh
方法四:sh < dart.sh
dart.sh输入到sh
sh输出
方法五:cat dart.sh | sh
方法六:bash dart.sh
更完善的脚本构成
- 脚本声明
- 注释信息
- 可执行语句
例:
重定向与管道操作
交互式硬件设备
- 标准输入:从该设备接受用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
系统默认
0代表输入
1代表标准输出
2代表标准错误输出
重定向操作
输入设备cat < 输出文件 passwd.txt
cat < passwd.txt=cat passwd.txt
重定向cat << 分界符0(1也是分界符)
/dev/null
-
看作为黑洞(空洞)
-
所有写入它的内容都会永远丢失,而尝试从它那读取内容则什么也读不到,然而 /dev/null 对命令行和脚本都非常的有用。
[root@ky19 ~]# cat /dev/null ——什么信息都看不到
echo ZYX 可以查看到 ZYX
要是不想看到 ZYX 就 echo ZYX > /dev/null
重定向输出
重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。
重定向输出使用“>”或“>>“操作符号,分别用于覆盖或追加文件
若重定向输出的目标文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中:若目标文件已经存在,则将输出结果覆盖或追加到文件中。
[root@ky19 ~]# uname -p ——查看内核
x86_64
[root@ky19 ~]# uname -p > ker.txt ——查看内核的内容重定向到内核文件中{ker.txt内核文件}
[root@ky19 ~]# cat ker.txt ——查看内核文件
x86_64
[root@ky19 ~]# uname -r ——查看内核版本及系统
3.10.0-957.el7.x86_64
[root@ky19 ~]# uname -r > ker.txt ——重定向内核的版本及系统,到内核文件中(ker.txt内核文件)(会覆盖之前的内容)
[root@ky19 ~]# cat ker.txt
3.10.0-957.el7.x86_64
[root@ky19 ~]# uname -p >> ker.txt ——追加一个“ > ”就不会覆盖之前的内容,会把内容追加到后面行数中
[root@ky19 ~]# cat ker.txt
3.10.0-957.el7.x86_64
x86_64
重定向输入
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用”<“操作符。
[root@ky19 ~]# echo "123456" > passwd.txt
[root@ky19 ~]# useradd Fdart
[root@ky19 ~]# passwd --stdin Fdart < passwd.txt ——把passwd.txt中的内容重定向到前面的用户中
更改用户 Fdart 的密码 。 ——如果下一步失败,可以试试 “setenforce 0”命令
passwd: 所有的额身份验证令牌已经成功更新。
[root@ky19 ~]# echo "123456" > passwd.txt ——echo“ ”中的数据重定向输入到passwd.txt(密码文件)
[root@ky19 ~]# cat passwd.txt ——查看passwd.txt(密码文件中的数据)
123456
[root@ky19 ~]# su dart
[dart@ky19 root]$ su Fdart
密码:
[Fdart@ky19 root]$
错误重定向
错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定的文件,而不是直接显示在屏幕上,错误重定向使用“ 2> ”操作符。
两个作用:
在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据。
还可以将无关紧要的错误信息重定向到空文件“ /dev/null ”中,以保持脚本输出的简洁。
使用“ 2> ”操作符时,会像使用“ > ”操作符一样覆盖一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应改用“ 2>> ”操作符
当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可以使用操作符 “>” 、“2>” 将两类输出信息分别保存到不同的文件,也可以使用 “&>” 操作符将两类输出信息保存到同一个文件。
例:
[root@ky19 ~]# grep "bash$" /etc/passwd | awk -F:'{print $1,$7} ——以冒号 :分隔,输出第1,7个字段
> root /bin/bash
> dart /bin/bash
重定向与管道操作
管道操作符号“ | ”
- 将左侧的命令输出结果,作为右侧命令的处理对象
&> 和 & 符号
& 表示等同于的意思
例
把正确和错误的信息输入到相同的位置
1 > &2 把标准输出重定向到标准错误
2 > &1 把标准错误重定向到标准输出
查看脚本是否出错 cat 1.txt
[root@ky19 ~]# ls /tmp a.txt > 1.txt 2>&1
或者
[root@ky19 ~]# ls /tmp a.txt 2> 2.txt 1>&2
wwwbbbaaa只会显示在屏幕上,不会放到1.txt中
清空1.txt可以直接"> 1.txt"
显示了标准输入的正确的信息显示出来
2.txt中输出的是错误信息
错误和正确的都输出到错误文件中(与上面的一个意思)
Shell 变量的作用、类型
变量的作用
- 用来存放系统和用户需要使用的特定参数(值)
- 变量名:使用固定的名称,由系统预设或用户定义
- 变量值:能够根据用户设置、系统环境的变化而变化
变量的类型
- 自定义变量:由用户自己定义、修改和使用
- 特殊变量:环境变量、只读变量、位置变量、预定义变量
自定义变量
-
定义一个新的变量
-
变量名以字母或下划线开头,区分大小写,建议全大写
变量名=变量值
-
-
查看变量的值
echo $变量名 [root@ky19 ~]# Product=Python [root@ky19 ~]# Version=2.7.13 [root@ky19 ~]# echo $Product Python [root@ky19 ~]# echo $Product $Version Python 2.7.13
变量名必须以字母或者下划线开头
unset $A $B 删除 $名
赋值时使用引号
- 双引号( " ):允许通过 $ 符号引用其他变量值
- 单引号( ’ ):禁止引用其他变量值,$ 视为普通字符
- 反撇号( ` 跟 ~ 一起的为 ):命令替换,提取命令执行后的输出结果
从键盘输入内容为变量赋值
read [-p "提示信息] 变量名
例
设置变量的作用范围
两种格式可以混合使用
格式1:export 变量名 …
格式2:export 变量名=变量值 …
设置全局变量
整数变量的运算
- expr 变量1 运算符 变量2 [运算符 变量3]…
常用运算符
- 加法运算:+
- 减法运算:-
- 乘法运算:\ *
- 除法运算:/
- 求模(取余)运算:%
例
expr 1 + 1 ——必须中间加空格
2
expr 2 \* 2
4
\为转义符
expr 2 '*' 2
4
expr 2 "*" 2
4
expr $[2 * 2]
4
[]作为运算符
expr $((2 * 2))
4
expr $(((2 * 2)))
4
expr $((10-100))
-90
expr,直接单括号都是语法错误
expr,不仅支持常量还支持变量的运算
X=40
Y=30
expr $Y + 6
36
expr $Y + $X
70
expr $X / $Y
1
expr $X % $Y
10
sum= expr $Y + $X + $Y
100
echo $sum ——取任意值
使用脚本执行输入两个数字后进行乘法运算
[root@ky19 ~]# vim xxxx.sh
执行运算出的结果:
let命令
let的运算可以改变变量本身的值,但不显示结果,需要echo,其他的运算方式可以做运算但不改变变量本身的值。
n=1;let n=n+1;echo $n
let n+=1
n+=1 就是 n=n+1
echo $[n++]
echo $[n--]
echo $[++n]
echo $[--n]
let n++
就是n自己+1
let n--
就是n自己-1
Linux计算机=bc命令
[root@ky19 ~]# bc
[root@ky19 ~]# echo “3^2” | bc
scale=3
小数点后3位
[root@ky19 ~]# echo “scale=3;10/3” | bc
3.333
且
&&前后命令都要满足才能运行
余
&前后只要一个满足都能运行
;
运行完第一个,直接运行第二个,运行结束第二个,直接运行第三个
特殊的Shell变量
环境变量
环境变量是指出于运行需要而由Linux系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登录终端等。环境变量由Linux系统自动维护,会随着用户状态的改变而改变:
如果修改之后,(uname) ,重启就可以恢复原样;
或者把之前的复制过来直接赋值变量
- 由系统提前创建,用来设置用户的工作环境
- 配置文件: /etc/profile、~/.bash_profile
常见的环境变量
- PWD、PATH
- USER、SHELL、HOME
PATH搜索路径
HOME用户的宿主目录
LANG字符集
RANDOM表示系统中随机生成的数字
通过env命令进行查看,全是设定好的:
[root@ky19 ~]# env
XDG_SESSION_ID=2
HOSTNAME=ky19
SELINUX_ROLE_REQUESTED=
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
SSH_CLIENT=192.168.10.1 62500 22
SELINUX_USE_CURRENT_RANGE=
OLDPWD=/home/dart
SSH_TTY=/dev/pts/1
USER=dart
临时设置
PATH=“$PATH:/root”
永久设置
vim /etc/profile
只读变量
用于变量值不允许被修改的情况
[root@ky19 ~]# name=dart1
[root@ky19 ~]# readonly name ——设置为只读变量
[root@ky19 ~]# echo $name
dart1
[root@ky19 ~]# name=dart2
bash: name: 只读变量 ——只读变量不可以被重新赋值
[root@ky19 ~]# unset name ——只读变量不可以被删除
bash: unset: name: 无法反设定: 只读 variable
位置变量
为了使用Shell脚本程序时,方便通过命令行为程序提供参数,bash引入了位置变量的概念。
-
表示为$n,n为1~9之间的数字
[root@ky19 ~]# ./dart1.sh 10 20 10 + 20=30 [root@ky19 ~]# ./dart1.sh Fdart 123456 useradd:用户“Fdart”已存在 123456 更改用户 Fdart 的密码 。 passwd:所有的身份验证令牌已经成功更新。
预定义变量
预定义变量是 Bash程序 预先定义好的一类特殊变量,用户只能使用预定义变量,只能使用不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用“ $ ”符号和另一个符号组合表示
$#:命令行中位置变量的个数。
$*:所有位置变量的内容。
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错。(常用)
$0:当前执行的进程/程序名
$@:表示列出所有位置参数,但是是以单个形式的列出
$$:表示返回当前进程的进程号
$!:返回最后一个后台进程的进程号