shell编程规范与变量
一、shell脚本概述
1.1shell概念
- 将要执行的命令按顺序保存到一个文本文件里
- 给该文件可执行权限
- 可结合各种shell控制语句以完成更复制的操作
什么是shell - 什么是Shell?就是与内核沟通的界面、应用程序等等。比如你要播放音乐,你的计算机通过你在shell输入的打开音乐的命令,Shell在告诉操作系统的内核用户希望打开音乐,内核在通过cpu调度、内存管理、磁盘输入输出等工作,将硬件调动,这时硬件声卡才会工作,硬件才是实际的工作者
- She11(壳程序)是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个”命令解释器”的角色,负责接收用户输入的操作指令(命今) 并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
1.2Linux有哪些shell
- 检查一下/etc/shells这个文件,里面就是Linux所包含的she11。
- 最常用的就是bash、tcsh、csh、sh、nologin这些shel1。这些shel1都是依据Linux发展者的不同所创造出的不同版本
- bash: 基准于GNU的框架下发展出的she11。
- csh: 语法有点类似于c语言的she11。
- tcsh: 整合了csh,提供更多的功能。
- sh: 已经被bash所替换。
- nologin: 奇怪的shell,这个shel1可以让用户无法登录主机
1.3shell脚本的作用
- 自动化运维
- 批量化重复操作可以编写脚本结合计划任务自动周期运行
- 减轻管理员的工作量
- 提高处理文件的速度
- 必变配置出错
- Shell是一个面向字符串的编程语言,可以跟python之类的其他语言配合起来,比如某个复杂的功能使用一个python脚本来实现,然后在shell中调用这个脚本实现较复杂的功能:或者反过来,在python脚本中调用外部的Shell脚本来提高自动化的效率,也是可以的。
面向对象的语言 - JAVA,PYTHON,C++,C#,GO
面向过程的语言 - C,shell
强类型语言 - JAVA,C,C++,C#,GO (编译型语言,执行前需要先编译,运行速度快)
弱类型语言 - PYTHON,Shell,PHP (不需要编译即可直接执行,常用于作脚本)
二、编写shell脚本的规范
2.1编写shell脚本的规范
- 脚本申明,解释器若第一行为”!/bin/bash”]表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。还有其它类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect。
- 注释信息:以”#”开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。
- 可执行语句:比如echo命令,用于输出” “之间的字符串
2.2运行shell脚本的两种方法
方法一:
- 指定路径的命令,要求文件必须有x权限
方法二:
- 指定shel1来解释脚本,不要求文件必须有x 权限
- 用 bash/sh 程序指定脚本文件运行,不需要执行权限,脚本会在子shell环境中运行
- 用 source/. 指定脚本文件运行,脚本会在当前shell环境中运行(会影响当前所在目录、变量的值 等因素)
三、重定向与管道操作
3.1交互式与硬件设备
- 标准输入:从该设备接收用户输入的数据
- 表示输出:提供该设备向用户输出的数据
- 标准错误:通过该设备报告执行出差的信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
3.2重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将结果保存到指定文件(覆盖原有内容 |
重定向追加 | >> | 将结果追加到指定文件尾部 |
标准错误输入 | 2> | 将错误信息保存到指定文件(覆盖原有内容) |
标准错误追加 | 2>> | 将错误信息追加到指定文件中 |
混合输出 | & > | 将标准输入,标准错误的内容保存到同一个文件中 |
混合输出 | 2>&1 | 同上 |
混合追加 | &>> | 原理同上 |
重定向输入
- 只能用于将文件里的内容给与命令执行,SELlinux会影响此命令执行
重定向输出与追加
标准输出错误
混合输出
3.3管道符号 “|”
- 将左侧的命令输出结果,作为右侧命令的处理对象
- 需要执行对象的命令则需要通过xargs命令传输
四、shell变量的作用、类型
变量的作用
- 用来存放系统和用户需要使用的特定参数
- 变量名: 试图固定名称,由系统预设或用户定义
- 变量值:能够共享用户设置,系统环境的变化而变化
变量的类型
- 自定义变量:由用户自己定义,修改和使用
- 特殊变量:环境变量,只读变量,位置变量,预定义变量
4.1自定义变量
- 变量名以字母或下划线开头,区分大小写,检验全大写变量名=变量值
- 格式 :变量名=变量值
- 查看变量值
- 格式: echo $变量名
4.1.1read -p
- 从键盘输出获取赋值给变量
4.1.2赋值时使用引号
- 双引号:允许通过$符号引用其它变量值
- 单引号:禁止引用其它变量值,$视为普通字符
- 反撇号:命令替换,提前命令执行后的输出结果
- $() :用法与反撇号一致
4.1.3全局变量设置export
- 普通定义的变量,换一个bash环境就无效了,想要变量在全局有效则需要加export
定义全局变量的两种方法
name1=lisi
export name1
export name2=zhangsan
4.1.4整数变量的运算
expr
- expr做乘法的时候需要在*前面加反撇号
echo $(()),echo $[ ]
let - 使用let定义一个变量,记录一个数值,用echo输出
加、减、乘、除、余,与上方一致
++与– - i++:将i定义的变量自增1,放在前面是输出i在自增
- ++i : 先自增,在输出
- –i,与 i – :与上方差不多加法变减法
- 要加或者减去其它数则i+=2,i-=2,i*=2
4.2环境变量
- 由系统提前创建,用来设置用户的各种环境
- 配置文件:/etc/profile、~/.bash_profiel
4.2.1常见的环境变量
- PWD:当前用户所在目录
- PATH:系统命令搜索的路径
- USER:当前登录用户
- HOME:当前用户登录的家目录
- SHELL:当前用户登录的SHELL环境
- LANG :当前系统的语言和字符集编码
- HISTSIZE:历史命令条目
- env :可查看当前系统有哪些环境变量
4.3只读变量
- 用于变量值不允许修改的情况
readonly,设置只读变量,不能被修改或删除
删除变量unset,不能删除只读变量
4.4位置变量
- $1~$9:代表第一个到第九个位置变量,代表脚本后面跟的以空间相间隔的参数
- ${10}:表示第十个参数,如果不加括号表示$1和0
- $0:代表脚本本身
- $#:代表脚本后面跟的以空间间隔的参数变量
- $?:代表上一条执行的命令是否成功,命令执行成功返回0,非0值均代表执行异常
- $* :不加双引号,代表结拜后面跟的以空格向间隔的所有参数;加上双引号后,会把脚本后面跟的以空格相隔的所有参数当作一个整体输出
- $@ :不加双引号时,代表脚本后面跟的以空格相间隔的所有参数;加上双引号后,效果不变,仍然会把每个参数当作一个个体
$0~$9的含义
$# 与 $?
** $ * 与$ @**
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/148413.html