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. 格式1:export 变量名
  2. 格式2:export 变量名=变量值
  3. 两种格式可以混合使用
    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].。。。。。
常用运算符

  1. 加法运算:+
  2. 减法运算:-
  3. 乘法运算:* 乘法必须要加\,因为在shell语言中,*代表通配符号
  4. 除法运算:/
  5. 求模(取余)运算:%
[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:预定义变量

  1. $#:命令行中位置变量的个数
  2. $*:所有位置变量的内容
  3. $?:上一条命令执行后返回的状态,当返回状态值为0时表示正常,非0值表示执行异常或出错
  4. $0:当前执行的进程/程序名
  5. 分析脚本
[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

猜你喜欢

转载自blog.csdn.net/qyf158236/article/details/108663831
今日推荐