Shell编程规范与变量
结构
Shell脚本概述
-
Shell的作用
-
Shell编程规范
-
重定向与管道
Shell脚本变量
-
自定义变量
-
特殊变量
Shell脚本概述
什么是Shell?就是与内核沟通的界面、应用程序等等。比如你要播放音乐,你的计算机通过你在Shell输入的打开音乐的命令, Shell在告诉操作系统的内核用户希望打开音乐,内核在通过cpu调度、内存管理、磁盘输入输出等工作,将硬件调动,这时硬件声卡才会工作,硬件才是实际的工作者
Shell (壳程序)是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器"的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
Linux中有哪些Shell?
检查一下/etc/shells这个文件,里面就是Linux所包含的Shell.最常用的就是bash、tcsh、csh、sh、nologin这些shell。这些shell都是依据Linux发展者的不同所创造出的不同版本。
bash: 基准于GNU的框架下发展出的Shell
csh: 语法有点类似于c语言的Shell
tcsh: 整合了csh,提供更多的功能
sh: 已经被bash所替换
nologin: 奇怪的shell,这个shell可以让用户无法登录主机。
注: bash (/bin/bash)是目前大多数Linux版本采用的默认Shell
为什么系统上合法的Shell要写入/etc/shells这个文件呢?
这是因为系统某些服务运行过程中,会去检查用户能够使用的Shell,而这些shell的查询就是借由/etc/shells这个文件
用户什么时候可以取得shell来工作?用户默认会取得哪一个shell?
当用户登录的时候,系统就会给我一个shell让我来用,而这个登录取得的Shell就记录在/etc/passwd这个文件内。
Shell脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shell控制语句以完成更复杂的操作
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
编写简单的Shell脚本
编写脚本代码
- 使用vim文本编辑器
- 每行一条Linux命令,按执行顺序依次编写
#!/bin/bash echo "hello"
赋予可执行权限
- 使脚本具有可执行属性
Shell脚本的执行
方法一:指定路径的命令,要求文件必须有x权限。
chmod +x /root/first.sh
指定绝对路径: /root/first.sh
指定相对路径: ./first.sh
方法二:指定Shell来解释脚本,不要求文件必须有x权限。
sh 脚本路径: sh first.sh
source 脚本路径: . first.sh或者source first.sh
####脚本文件路径(绝对路径与相对路径)
[root@localhost ~]# /opt/first_demo.sh #必须有x权限
####sh 脚本文件路径
[root@localhost ~]# sh /opt/first_demo.sh
####source 脚本文件路径
[root@localhost ~]# source /opt/first_demo.sh #也可通过"."来执行
更完善的脚本构成
-
脚本声明
-
注释信息
-
可执行语句
重定向与管道操作
交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
重定向操作
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 将错误信息追加到指定的文件中 | |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
管道操作符号
- 将左侧的命令输出结果,作为右侧命令的处理对象
-
不是所有命令都适用管道符号,有时需要xargs命令来传输
示例:
[root@localhost ~]# free -m ####查看内存和交换分区的使用情况 total used free shared buff/cache available Mem: 1823 753 66 9 1003 835 Swap: 4095 0 4095 [root@localhost ~]# free -m | grep "Mem" ####筛选"Mem"行 Mem: 1823 750 69 9 1002 839 [root@localhost ~]# free -m | grep "Mem" | awk '{print $4}' ####查看物理内存的剩余空间 65
Shell变量的作用、类型
变量的作用
- 用来存放系统和用户需要使用的特定参数(值)
- 变量名:使用固定的名称,由系统预设或用户定义
- 变量值:能够根据用户设置、系统环境的变化而变化
变量的类型
- 自定义变量:由用户自己定义、修改和使用
- 特殊变量:环境变量,只读变量,位置变量,预定义变量
自定义变量
定义一个新的变量
变量名=变量值
查看变量的值
echo $变量名
赋值时使用引号
- 双引号:允许通过$符号引用其他变量值
- 单引号:禁止引用其他变量值, $视为普通字符
- 反撇号:命令替换,提取命令执行后的输出结果
[root@localhost ~]# name=zhangsan [root@localhost ~]# echo $name zhangsan [root@localhost ~]# name=test1 [root@localhost ~]# echo $name test1 [root@localhost ~]# echo "$name is authorized" ###允许通过$符号引用其他变量值 test1 is authorized [root@localhost ~]# echo '$name is authorized' ###禁止引用其他变量值,$视为普通字符 $name is authorized [root@localhost ~]# info=`ls -r` ###命令替换,提取命令执行后的输出结果 [root@localhost ~]# echo $info 桌面 音乐 下载 文档 图片 视频 模板 公共 passwd6.txt ks.cfg initial-setup-ks.cfg anaconda-ks.cfg
从键盘输入内容为变量赋值
read [-p "提示信息"] 变量名
[root@localhost ~]# read -p "please input your name:" username please input your name:xiaoming [root@localhost ~]# echo $username xiaoming
自定义变量
设置变量的作用范围
格式1: export 变量名 … 格式2: export 变量名=变量值 …
局部变量:
直接设置的变量是局部变量,只在当前shell 环境生效,如果重开终端,或者开启一个新的shell 环境,或者登陆其他用户账号,则变量失效
[root@localhost ~]# name=lisi [root@localhost ~]# echo $name lisi [root@localhost ~]# bash [root@localhost ~]# echo $name [root@localhost ~]# exit exit [root@localhost ~]# echo $name lisi
全局变量:
可以在全局都有效的变量,不管是新的bash环境,还是其他用户账号,都会有效
[root@localhost ~]# export myhost=jiangsu [root@localhost ~]# echo $myhost jiangsu [root@localhost ~]# bash [root@localhost ~]# echo $myhost jiangsu [root@localhost ~]# exit exit
整数变量的运算
expr 变量1 运算符 变量2 [运算符 变量3] …
常用运算符
- 加法运算: +
- 减法运算: -
- 乘法运算: \*
- 除法运算: /
- 求模(取余)运算: %(和乘除运算有相同优先级)
特殊的Shell变量
环境变量
- 由系统提前创建,用来设置用户的工作环境
- 配置文件: /etc/profile、-/.bash_profile
常见的环境变量
- PWD, PATH
- USER, SHELL, HOME
只读变量
- 用于变量值不允许被修改的情况
[root@localhost ~]# name=cloud [root@localhost ~]# readonly name //设置为只读变量 [root@localhost ~]# echo $name cloud [root@localhost ~]# name=yun -bash:name:readonly variable //只读变量不可以被重新赋值 [root@localhost ~]# [root@localhost ~]# unset name //只读变量不可以被删除 -bash:unset:name:cannot unset:readonly variable