Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当
了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执
行的操作传递给内核执行,并输出执行结果。
常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符
等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。
cat? ?/etc/shells###查看当前系统支持的shell
linux中常见的shell
---bash:基于gun的框架下发展的shell
---csh:类似c语言的shell
---tcsh:整合了csh提供了更多功能
---sh:已经被bash替换
---nologin:让用户无法登录
bash (/bin/bash)是目前大多数Linux 版本采用的默认shell
shell脚本用途
- 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
- 减少手工命令的重复输入,一定程度上避免人为错误
- 将软件或应用的安装及配置实现标准化
- 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等
- 就是将命令按顺序一一列出,最后自动执行
- 执行需要权限,也可以直接使用路径 ? ?
- 脚本其实不复杂,通用脚本环境改变后依然可以使用的脚本
构成
1. 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python ? ? ?#!/bin/expect
2. 注释信息:以#开头的语句表示为注释信息 ? ? ? ? # 注 释?
3. 可执行语句:比如echo命令用于输出“ ? ?”之间的字符串
不管绝对路径还是相对路径执行,都要加权限才行
原因:
使用前两个方式执行脚本会开启子bash去执行
使用source 和 .? 会影响当前的bash环境
source 和 .? 没有子进程,会影响当前环境
前两种会产生子进程,不会影响当前环境
子进程运行完就会结束,自行消失
命令出错不会影响接下来的命令继续
hostname
echo 'finsh'
会影响接下来的命令继续
只能自己去排查
比如:你回家想先吃饭,但你去睡觉了,事情没毛病,但和你一开始的想法,逻辑不对。?
bash? ? -n###检查语法错误
bash? ? -e###检查逻辑错误
总结:脚本错误常见的有三种区别
1. 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
2. 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
3. 逻辑错误:只能使用 bash -x 进行
写脚本目的:避免人机交互
shell的作用:命令解释器
脚本执行逻辑
1. ?顺序执行:程序按从上到下顺序执行 ? ? ? ??
2. ?选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
3. ?循环执行:程序执行过程中需要重复执行多次某段语句
执行方式
1. 指定路径去执行文件(需要有执行权限)
[root@localhost ~]# chmod +x /root/host.sh ? ?加权限
指定相对路径./host.sh
指定绝对路径/root/host.sh
2.指定shell解释器去执行(不需要权限)
[root@localhost ~]# bash host.sh 192.168.91.1
与真机网络通顺指定了使用 bash去执行脚本不需要权限
[root@localhost ~]# . qiuhe.sh
[root@localhost ~]#source qiuhe.sh ? ?// 会影响当前环境
[root@localhost ~]#source first.sh?
当前的目录位于:
/boot
其中以vml开头的文件包括:
-rwxr-xr-x. 1 root root 5.7M 8月 ? 6 21:02 vmlinuz-0-rescue-869dbd607e5e4f758fa152ef2229f2b6
-rwxr-xr-x. 1 root root 5.7M 8月 ?23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@localhost boot]#?
会影响你的当前目录
[root@localhost ~]# cat qiuhe.sh | bash
结果是5050
[root@test1 ~]# vim first.shcd /root
pwd
ls -l
添加执行权限的方法
[root@test1 ~]# $PATH ? ? ? ? ? ? ? ? ? //查看系统程序
-bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin: 没有那个文件或目录
[root@test1 ~]# pwd
/root
[root@test1 ~]# mkdir bin ? ? ? ? ? ? ?//新建bin文件夹
[root@test1 ~]# ls
bin ?disk.sh ?first.sh ?gs.sh ?g.txt ?passwd.txt ?sdb.sh ?source
[root@test1 ~]# cp first.sh bin/ ? ? ? //将脚本拷入 此方法不限制路径
[root@test1 ~]# first.sh ? ? ? ? ? ? ? //执行脚本 ? ? ? ??
/root
总用量 24
drwxr-xr-x. 2 root root ?22 7月 ?22 11:33 bin
-rwxr-xr-x. 1 root root ?62 7月 ?16 11:05 disk.sh
-rwxr-xr-x. 1 root root ?29 7月 ?22 10:50 first.sh
-rwxr-xr-x. 1 root root 142 7月 ?16 14:28 gs.sh
-rw-r--r--. 1 root root ?63 7月 ?16 11:36 g.txt
-rw-r--r--. 1 root root ? 9 7月 ?19 10:15 passwd.txt
-rwxr-xr-x. 1 root root ?61 7月 ?16 11:14 sdb.sh
drwxr-xr-x. 2 root root ? 6 7月 ?20 09:33 source[root@test1 ~]# ./first.sh ? ? ? ?//需要权限
/root
总用量 24
drwxr-xr-x. 2 root root ?22 7月 ?22 11:33 bin
-rwxr-xr-x. 1 root root ?62 7月 ?16 11:05 disk.sh
-rwxr-xr-x. 1 root root ?29 7月 ?22 10:50 first.sh
-rwxr-xr-x. 1 root root 142 7月 ?16 14:28 gs.sh
-rw-r--r--. 1 root root ?63 7月 ?16 11:36 g.txt
-rw-r--r--. 1 root root ? 9 7月 ?19 10:15 passwd.txt
-rwxr-xr-x. 1 root root ?61 7月 ?16 11:14 sdb.sh
drwxr-xr-x. 2 root root ? 6 7月 ?20 09:33 source[root@test1 ~]# ./first.sh ? ? ? ? ??
-bash: ./first.sh: 权限不够
[root@test1 ~]# source first.sh ? ? ? ? ? ?//source无需权限
/root
总用量 24
drwxr-xr-x. 2 root root ? 6 7月 ?22 11:41 bin
-rwxr-xr-x. 1 root root ?62 7月 ?16 11:05 disk.sh
-rw-r--r--. 1 root root ?29 7月 ?22 10:50 first.sh
-rwxr-xr-x. 1 root root 142 7月 ?16 14:28 gs.sh
-rw-r--r--. 1 root root ?63 7月 ?16 11:36 g.txt
-rw-r--r--. 1 root root ? 9 7月 ?19 10:15 passwd.txt
-rwxr-xr-x. 1 root root ?61 7月 ?16 11:14 sdb.sh
drwxr-xr-x. 2 root root ? 6 7月 ?20 09:33 source
[root@test1 ~]# sh first.sh ? ? ? ?//sh无需权限
/root
总用量 24
drwxr-xr-x. 2 root root ? 6 7月 ?22 11:41 bin
-rwxr-xr-x. 1 root root ?62 7月 ?16 11:05 disk.sh
-rw-r--r--. 1 root root ?29 7月 ?22 10:50 first.sh
-rwxr-xr-x. 1 root root 142 7月 ?16 14:28 gs.sh
-rw-r--r--. 1 root root ?63 7月 ?16 11:36 g.txt
-rw-r--r--. 1 root root ? 9 7月 ?19 10:15 passwd.txt
-rwxr-xr-x. 1 root root ?61 7月 ?16 11:14 sdb.sh
drwxr-xr-x. 2 root root ? 6 7月 ?20 09:33 source
#########一旦出错,立即停止
变量不存在,不让执行
类型 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /devstdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容 |
2>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
Here Document 概述
使用 I/O 重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。
HereDocument是标准输入的一种替代品,
可以帮助脚本开发人员不必使用临时文件来构建输入信息,
而是直接就地生产出一个文件并用作命令的标准输入。
管道符 ? ? ? | ??
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
[root@localhost opt]# ls /opt |wc
? ? ? 2 ? ? ? 2 ? ? ?12修改密码
[root@localhost opt]# echo "123123" |passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新[root@test1 ~]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
[root@test1 ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
zhangsan /bin/bash
lisi /bin/bash
?
` ? ` ?$( ?) ? ?调用命令执行的结果
' ?' ?强引用 ?不识别变量 ? 本来含义
" ?" ?弱引用 ?他识别变量
{ } ? 规定变量的范围
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。
环境变量:由系统维护,用于设置工作环境 ? ? ?当前目录 ?当前主机名啊 ? $PATH ? ??
只读变量:只可以读取不可以更改 ? ? ? ? ? ? ?只能不能修改 ? ?常量 ??
位置变量:通过命令行给脚本传递参数
- 区分大小写
- 不能使程序中的保留字和内置变量:如:if, for,hostname ? 命令 ?a= ??
- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反 ? ?
- 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH ? ? ? ? ? ? ?
- 大驼峰 StudentFirstName?
- 小驼峰 studentFirstName?
- 下划线 student_name
双引号###弱应用,可以识别变量
单引号###强引用,不能识别变量
{ ? ? }###定义变量0的范围
``###调用命令的执行结果 ?= ?$() ? 功能一致