Linux shell编程规范变量详解(shell编程规范,执行脚本的方式,管道符号与重定向,shell变量类型)
前言
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Linux 命令的执行必须依赖于 Shell 命令解释器。Shell 实际上是在 Linux 操作系统中运行的一种特殊程序,它位于操作系统内核与用户之间,负责接收用户输入的命令并进行解释, 将需要执行的操作传递给系统内核执行,shell 在用户和内核之间充当了“翻译官”的角色。当用户登录到 Linux 系统时,会自动加载一个 Shell 程序,以便给用户提供可以输入命令的操作系统。
一 : shell脚本概述
1.1:shell脚本的概念
- 将要执行的命令按照顺序保存到一个文本文件
- 给该文件可执行的权限,便于运行 +一个x的执行权限
- 可结合各种shell控制语句以完成更复杂的操作
1.2 :shell脚本应用场景
- 重复性操作
- 批量化事务处理
- 自动化运维管理
- 服务器运行状态监控
- 定时任务执行
- ……
shell的作用-----命令解释器,“翻译官”
1.3:用户的登陆shell
- 登陆后默认使用的shell程序,一般为/bin/bash
- 不同shell的内部命令、运行环境等会有所区别
[root@server1 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
1.31:type命令----显示指定命令类型
[root@shuai opt]# type cd
cd 是 shell 内嵌
[root@shuai opt]# type mkdir
mkdir 是 /usr/bin/mkdir
[root@shuai opt]# type bash
bash 是 /usr/bin/bash
[root@shuai opt]# type which
which 是 `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' 的别名
1.4:编写第一个shell脚本
1.41:编写脚本代码
- 使用vi文本编辑器
- 每行一条Linux命令,按执行顺序依次编写
- 脚本后缀为.sh
vim cendy.sh
#!/bin/bash #shell脚本固定格式
cd /boot #切换到boot目录
pwd #查看当前所在位置
ls -lh vml* #看vml开头所有文件
:wq #ESC切换到命令模式 保存退出
[root@server1 test]# ls -lh
总用量 4.0K
-rwxr-xr-x. 1 root root 38 9月 18 14:10 cendy.sh
1.4.2赋予可执行权限
[root@server1 test]# chmod +x cendy.sh
1.5:执行脚本文件
- 方法一:脚本文件路径(绝对路径与相对路径)
[root@server1 test]# ls -lh
总用量 8.0K
-rwxr-xr-x. 1 root root 38 9月 18 14:10 cendy.sh
-rw-r--r--. 1 root root 25 9月 18 14:25 jerry #无执行权限
[root@server1 test]# ./jerry.sh
-bash: ./jerry.sh: 权限不够
[root@server1 test]# ./cendy.sh
/boot
-rwxr-xr-x. 1 root root 5.7M 8月 26 17:42 vmlinuz-0-rescue-34c5caefc7194359afe5202e8cdfd9fe
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
- 方法二:sh 脚本文件路径
[root@server1 test]# sh jerry.sh
/boot
-rwxr-xr-x. 1 root root 5.7M 8月 26 17:42 vmlinuz-0-rescue-34c5caefc7194359afe5202e8cdfd9fe
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
二:重定向与管道操作
2.1:交互式硬件设备 0 1 2
- 标准输入:从该设备接受用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出/dev/stdout | 1 | 显示器 | |
标准错误输出 | /dev/stder | 2 | 显示器 |
2.2:重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
重定向输出 | >> | 将输出结果追加到指定的文件 |
标准错误输出2 | > | 将错误信息保存到指定的文件(覆盖原有内容) |
标准错误输出 | 2>> | 将错误信息追加到指定的文件中 |
混合输出& | > | 将标准输出,标准错误的内容保存到同一个文件中 |
2.3:管道操作符号“|”
- 将左侧的命令输出结果,作为右侧命令的处理对象
[root@server1 test]# grep "bash$" /etc/passwd #查看以bash结尾的登录账号
root:x:0:0:root:/root:/bin/bash
amandabackup:x:33:6:Amanda user:/var/lib/amanda:/bin/bash
qy:x:1000:1000:qyf:/home/qyf:/bin/bash
#以冒号分隔,输出第1,7个字段 ##如果不写-F 就是指标符号跟空格
[root@server1 test]# grep "bash$" /etc/passwd | awk -F: '{print $1.$7}'
root/bin/bash
amandabackup/bin/bash
qyf/bin/bash
awk是正则表达式的一种
大部分情况下
grep:过滤关键字 grep egrep
sed 老二 按行读取
awk 老三 按列读取数据
sed: 按行读取
awk:按列读取数据
$1,$7:位置变量
[root@shuai opt]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 50G 5.0G 46G 10% /
devtmpfs devtmpfs 3.6G 0 3.6G 0% /dev
tmpfs tmpfs 3.6G 0 3.6G 0% /dev/shm
tmpfs tmpfs 3.6G 13M 3.6G 1% /run
tmpfs tmpfs 3.6G 0 3.6G 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 179M 836M 18% /boot
/dev/mapper/centos-home xfs 242G 33M 242G 1% /home
tmpfs tmpfs 726M 4.0K 726M 1% /run/user/42
tmpfs tmpfs 726M 48K 726M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
####提取第一个跟第六个
[root@shuai opt]# df -Th | awk '{print $1,$6}'
文件系统 已用%
/dev/mapper/centos-root 10%
devtmpfs 0%
tmpfs 0%
tmpfs 1%
tmpfs 0%
/dev/sda1 18%
/dev/mapper/centos-home 1%
tmpfs 1%
tmpfs 1%
/dev/sr0 100%
##过滤以/结尾 第一列跟第六列
[root@shuai opt]# df -Th | grep "/$" | awk '{print $1,$6}'
/dev/mapper/centos-root 10%
三:shell脚本变量详解
3.1 :变量的作用、类型 变量:变量是编程中最常见的一种
临时在内存中存取数据的一种方式
3.11:变量的作用
为灵活管理limux系统提供特定参数,有两层意思
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
3.12:变量的类型
自定义变量:由用户自己定义、修改和使用
环境变量:由系统维护,用于设置工作环境
位置变量:通过命令行给脚本程序传递参数
预定义变量:Bash中内置的一类变量,不能直接修改
3.2:自定义变量
3.21:定义一个新的变量与查看变量的值
定义一个新的变量——自定义变量 = echo
变量名以字幕或下划线开头,区分大小写,建议全大写
变量格式 变量名=变量值
查看变量的值
echo $变量名
3.22:变量命名规则
命名只能使用英文字母,数字和下划线,首个字符不能用数字开头’
中间不能有空格,可以用下挂线—
不能使用标点符号
不能使用bash的关键字【可用help命令查看保留关键字】
VFDA=2
age=90 整型 ##这边的=叫赋值符号
name=‘baisn’ 字符串
score=88.8 【单精浮点 4 字节】shuai=8.88【双精 浮点 8字节】
[root@server1 test]# dd=20
[root@server1 test]# $dd=20
bash: 20=20: 未找到命令...
[root@server1 test]# echo $dd 20
20 20
[root@server1 test]# echo $dd
20
[root@server1 test]# name=dd
[root@server1 test]# echo $name
cc
[root@server1 test]# echo $name dd
cc dd
3.23:取消变量unset
[root@server1 test]# name=aa
[root@server1 test]# echo $name
aa
[root@server1 test]# unset name #取消变量
[root@server1 test]# echo $name
#输出为空
3.24:赋值时使用引号
- 双引号
允许通过符号引用其他变量值,即在可以代表字符串的情况下,若是有 符号引用其他变量值,即在可以代表字符串的情况下,若是有符号引用其他变量值,即在可以代表字符串的情况下,若是有存在也可以代表标量 - 单引号
禁止引用其他变量值,是为普通字符,即视为字符串,不识别变量符号反撇号:命令替换,提取命令执行后的输出结果变量=反撇号相当于变量=()
[root@server1 test]# siri=10
[root@server1 test]# echo $siri
10
[root@server1 test]# siri2="50 $siri"
[root@server1 test]# echo $siri2
50 10
[root@server1 test]# siri=`ps aux | wc -l`
[root@server1 test]# echo $siri
204
[root@server1 test]# siri='ps aux | wc -l'
[root@server1 test]# echo $siri
ps aux | wc -l
3.25:从键盘输入内容为变量赋值 read
[root@server1 test]# vim weather.txt
#!/bin/bash
read -p "请输入今天的天气:" weather
echo "今天天气是: $weather"
#命令模式 :wq 保存退出
[root@server1 test]# chmod +x weather.txt
[root@server1 test]# ./weather.txt
3.26:设置变量的作用范围 export 设置全局可用
- 格式1:export 变量名
- 格式2:export 变量名=变量值
- 两种格式可以混合使用
export可以把变量定义为全局变量,这样的话,不管是切换bash环境,还是切换用户都可以使用该变量
[root@server1 test]# tom=shu
[root@server1 test]# echo $tom
shu
[root@server1 test]# bash #设置bash环境
[root@server1 test]# echo $tom
#输出为空
[root@server1 test]# exit #退出bash环境
exit
[root@server1 test]# echo $tom
shu
[root@server1 test]# export tom #设置为全局变量
[root@server1 test]# bash
[root@server1 test]# echo $tom #引用全局变量
shu
3.27: 整数变量的运算 expr
expr 变量1 运算符 变量2 [运算符 变量3].。。。。。
常用运算符
- 加法运算:+
- 减法运算:-
- 乘法运算:* 乘法必须要加\,因为在shell语言中,*代表通配符号
- 除法运算:/
- 求模(取余)运算:%
[root@server1 test]# expr 1 + 2
3
[root@server1 test]# expr 5 - 2
3
[root@server1 test]# expr 5 \* 2
10
[root@server1 test]# expr 2 / 2
1
[root@server1 test]# expr 5 % 2
1
[root@server1 test]# vim test1.sh
#!/bin/bash
read -p "第一天学习了几个小时:" time1
read -p "第二天学习了几个小时:" time2
time=`expr $time1 + $time2`
echo "两天学习时间总和为$time "
[root@server1 test]# chmod +x test1.sh
[root@server1 test]# ./test1.sh
第一天学习了几个小时:12
第二天学习了几个小时:12
两天学习时间总和为24
四:特殊的shell变量
4.1 环境变量
- 由系统提前创建,用来设置用户的工作环境
- 配置文件: /etc/profile、~/.bash_prolile
4.2 常见的环境变量
- PWD\、PATH
- USER、SHELL、HOME
[root@server1 test]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@server1 test]# echo $PWD
/root/test
[root@server1 test]# vim test2.sh
[root@server1 test]# sh test2.sh 40 20
第一个值 40
第二个值 20
减运算结果为20
4.3:预定义变量
- $#:命令行中位置变量的个数
- $*:所有位置变量的内容
- $?:上一条命令执行后返回的状态,当返回状态值为0时表示正常,非0值表示执行异常或出错
- $0:当前执行的进程/程序名
- 分析脚本
[root@server1 test]# vim test3.sh
#!/bin/bash
t=b-`date +%s`.tgz #设置变量名称,+%s表示从1970年至今的秒数
tar zcvf $t $* &> /dev/null #压缩到 /dev/null
echo "已执行$0个脚本"
echo "共完成$#个对象的备份"
echo "具体内容包括:$*"
[root@server1 test]# chmod +x test3.sh
[root@server1 test]# ./test3.sh /etc/passwd /etc/shadow
已执行./test3.sh个脚本
共完成2个对象的备份
具体内容包括:/etc/passwd /etc/shadow
#/dev/null:黑洞
%Y表示年
%m表示月
%d表示日
%H表示小时
%M表示分钟
%S表示秒
%s表示从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数,相当于time函数
%w表示一周中的第几天。
[root@server1 test]# date
2020年 09月 20日 星期日 22:04:22 CST
[root@server1 test]# date +%Y%D$%H:%M
202009/20/20$22:03
[root@server1 test]# date +%s #从1970年1月1日到现在的秒数
1600610688