shell脚本快速入门系列—————— shell脚本编程规范
时间:2022-07-24
本文章向大家介绍shell脚本快速入门系列—————— shell脚本编程规范,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、开发语言概述
开发语言简单举例:shell,Python,Java,JavaScript,HTML,CSS
强语言:定义变量时需要声明数据类型:如Java,C语言等
整型:int ,如1 ,2 ,3, ,100,等 长整型:Long 浮点型 单精度,float,4字节,如3.14 双精度,double,8字节 String:字符串 char ,字符 ‘a’ 1字节(Java中 ‘a’ 2字节),'男’2字节 boolean,布尔值,true or false date,日期 int a=10; 弱语言:不需要声明,如shell,JavaScript,Python
a=10 a=10.1 HTML,标记语言,标签, ,xml文件格斯
json,键:值,key:value,a:10
shell变量直接定义,不需要声明,没有面向对象思想,所有的语言编写犹如记流水账
2、shell脚本应用场景
- shell脚本的概念 将要执行的命令按顺序保存到一个文件文本 给该文件可执行权限,便可运行 可结合各种shell控制语句以完成更复杂的操作
- shell脚本应用场景 重复性操作 批量事务处理 自动化运维 服务运行状态监控 定时任务执行
3、shell编程规范
shell的作用
命令解释器,“翻译官”
介于系统内核与用户之间,负责解释命令行
用户的登录shell
登录后默认使用的shell程序,一般为/bin/bash
不同shell的内部指令,运行环境等会有所区别
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
4、编写第一个shell脚本
(1)编写脚本代码
- 使用vim文本编辑器
- 每行一条Linux命令,按执行顺序依次编写
- 脚本后缀为.sh
- 例如,将一下三条命令按顺序用shell脚本编写
cd /boot
pwd
ls -lh vm*
[root@localhost opt]# vim demo.sh
#!/bin/bash 'shell脚本标准格式'
cd /boot
pwd
ls -lh vm*
~ '保存退出'
[root@localhost opt]# ls
demo.sh rh
(2)执行脚本文件(四种方法)
方法一:sh脚本文件路径
[root@localhost opt]# sh demo.sh
/boot
-rwxr-xr-x. 1 root root 5.7M Oct 23 14:07 vmlinuz-0-rescue-d078430d0d8f434fb5ad6e47678ea86f
-rwxr-xr-x. 1 root root 5.7M Aug 23 2017 vmlinuz-3.10.0-693.el7.x86_64
方法二:source脚本文件路径
[root@localhost opt]# source demo.sh
/boot
-rwxr-xr-x. 1 root root 5.7M Oct 23 14:07 vmlinuz-0-rescue-d078430d0d8f434fb5ad6e47678ea86f
-rwxr-xr-x. 1 root root 5.7M Aug 23 2017 vmlinuz-3.10.0-693.el7.x86_64
方法三:.空格脚本文件路径
[root@localhost opt]# . demo.sh '会自动切换到目标文件夹,所以文件夹需要切换回/opt'
/boot
-rwxr-xr-x. 1 root root 5.7M Oct 23 14:07 vmlinuz-0-rescue-d078430d0d8f434fb5ad6e47678ea86f
-rwxr-xr-x. 1 root root 5.7M Aug 23 2017 vmlinuz-3.10.0-693.el7.x86_64
方法三:.空格脚本文件路径
[root@localhost opt]# . demo.sh '会自动切换到目标文件夹,所以文件夹需要切换回/opt'
/boot
-rwxr-xr-x. 1 root root 5.7M Oct 23 14:07 vmlinuz-0-rescue-d078430d0d8f434fb5ad6e47678ea86f
-rwxr-xr-x. 1 root root 5.7M Aug 23 2017 vmlinuz-3.10.0-693.el7.x86_64
方法四:脚本文件路径(绝对路径与相对路径)
[root@localhost boot]# cd /opt 'source之后会自动切换到目标文件夹,所以文件夹需要切换回/opt'
[root@localhost opt]# ./ demo.sh
-bash: ./: Is a directory '提示没有权限'
[root@localhost opt]# chmod +x demo.sh '增加权限'
[root@localhost opt]# ./demo.sh
/boot
-rwxr-xr-x. 1 root root 5.7M Oct 23 14:07 vmlinuz-0-rescue-d078430d0d8f434fb5ad6e47678ea86f
-rwxr-xr-x. 1 root root 5.7M Aug 23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@localhost opt]# '拥有权限之后,我们做个另两种方法的测试'
[root@localhost opt]# sh demo.sh
/boot
-rwxr-xr-x. 1 root root 5.7M Oct 23 14:07 vmlinuz-0-rescue-d078430d0d8f434fb5ad6e47678ea86f
-rwxr-xr-x. 1 root root 5.7M Aug 23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@localhost opt]# source demo.sh
/boot
-rwxr-xr-x. 1 root root 5.7M Oct 23 14:07 vmlinuz-0-rescue-d078430d0d8f434fb5ad6e47678ea86f
-rwxr-xr-x. 1 root root 5.7M Aug 23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@localhost boot]#
(3)执行脚本文件(四种方法)的总结
- source与sh和.空格 执行脚本,涉及到切换路径时,source和.空格会切换路径,但sh不会切换路径
./类似于sh,不切换路径
- 没有权限时,四种方式,.空格 sh和source可以执行,./不可以执行。有权限时,四个都可以执行
(4)更完善的脚本构成
[root@localhost opt]# vim demo.sh
#!/bin/bash
#This is my first shell-script '脚本描述信息'
cd /boot
echo "当前所在路径:" '输出友好提示信息'
pwd
echo "以vm为开头的文件是:" '输出友好提示信息'
ls -lh vm*
[root@localhost opt]# ./demo.sh
当前所在路径:
/boot
以vm为开头的文件是:
-rwxr-xr-x. 1 root root 5.7M Oct 23 14:07 vmlinuz-0-rescue-d078430d0d8f434fb5ad6e47678ea86f
-rwxr-xr-x. 1 root root 5.7M Aug 23 2017 vmlinuz-3.10.0-693.el7.x86_64
5、管道与重定向
(1)交互式硬件设备
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
(2)重定向操作
[root@localhost opt]# chattr +i /etc/passwd /etc/shadow '锁定用户和密码文件'
[root@localhost opt]# lsattr /etc/passwd /etc/shadow '查看锁定情况'
----i----------- /etc/passwd
----i----------- /etc/shadow
[root@localhost opt]# useradd lisi '尝试添加用户'
useradd: cannot open /etc/passwd '提示错误'
[root@localhost opt]# useradd lisi 2> /opt/error.txt '将错误信息输入到新的error.txt'
[root@localhost opt]# ls
demo.sh error.txt rh
[root@localhost opt]# cat /opt/error.txt '查看文本内容'
useradd: cannot open /etc/passwd
[root@localhost opt]# '操作没有错误,则输出的内容没有错误信息'
(3)管道操作符号“|”
将左侧的命令输出结果,作为右侧命令的处理对象(前后有关系时使用)
[root@localhost opt]# grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
lisi:x:1000:1000:lisi:/home/lisi:/bin/bash
[root@localhost opt]# grep "bash$" /etc/passwd | awk -F: '{print $1,$7}' '此间的-F:也可以用空格和Tab代替'
root /bin/bash
lisi /bin/bash
[root@localhost opt]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 xfs 20G 4.1G 16G 21% /
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 912M 0 912M 0% /dev/shm
tmpfs tmpfs 912M 9.1M 903M 1% /run
tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda5 xfs 10G 39M 10G 1% /home
/dev/sda1 xfs 6.0G 174M 5.9G 3% /boot
tmpfs tmpfs 183M 4.0K 183M 1% /run/user/42
tmpfs tmpfs 183M 36K 183M 1% /run/user/1000
tmpfs tmpfs 183M 0 183M 0% /run/user/0
[root@localhost opt]# df -hT | awk '{print $1,$2,$6}' '查看第1.2.6列的数据'
Filesystem Type Use%
/dev/sda2 xfs 21%
devtmpfs devtmpfs 0%
tmpfs tmpfs 0%
tmpfs tmpfs 1%
tmpfs tmpfs 0%
/dev/sda5 xfs 1%
/dev/sda1 xfs 3%
tmpfs tmpfs 1%
tmpfs tmpfs 1%
tmpfs tmpfs 0%
[root@localhost opt]# df -hT | awk -F " " '{print $1,$2,$6}' '查看第1.2.6列的数据'
Filesystem Type Use%
/dev/sda2 xfs 21%
devtmpfs devtmpfs 0%
tmpfs tmpfs 0%
tmpfs tmpfs 1%
tmpfs tmpfs 0%
/dev/sda5 xfs 1%
/dev/sda1 xfs 3%
tmpfs tmpfs 1%
tmpfs tmpfs 1%
tmpfs tmpfs 0%
[root@localhost opt]# df -hT | grep "sda2" | awk '{print $6}'
21% '查看设备sda2第6列的数据'
awk :大部分情况,按列读取 大部分情况下 grep:过滤关键字 sed: 按行读取 awk:按列读取数据
1,2:位置变量
- Jquery 触发器之treigger()方法简介
- 如何节省 1TB 图片带宽?解密极致图像压缩
- Redis快速入门
- 王者荣耀未来新版本的环境优化计划,人工智能技术将引入
- Jquery遍历数组之$.inArray()方法介绍
- [原创图解]Win2003证书服务配置/客户端(服务端)证书申请/IIS站点SSL设置
- JavaScript之firstChild属性、lastChild属性、nodeValue属性学习
- JavaScript之获取和设置元素属性
- JavaScript之childNodes属性、nodeType属性学习
- JavaScript之怎样获取元素节点
- JavaScript之对象学习
- 快速入门系列--MVC--07与HTML5移动开发的结合
- JavaScript之数组学习
- JavaScript之字符串引号的使用技巧
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux tcpdump 命令详解与示例
- 手动搭建Hadoop分布式集群
- Ansible-安装配置
- React-Redux 100行代码简易版探究原理。
- Ansible-免密登录与主机清单Inventory
- 安装Ambari和HDP
- React中引入Vue3的@vue/reactivity 实现响应式状态管理
- Ansible Ad-Hoc与常用模块
- Ansible Playbook 初识
- Ansible Playbook 变量与 register 详解
- 初探 Spark ML 第一部分
- Ansible Facts 变量详解 添加用户账号Ansible 配置清单Inventory
- Ansible playbook 编程
- 前端工程师自检清单73答
- Ansible playbook Vault 加密