shell 编程基础

一、什么是shell

我们使用Google翻译:

在这里插入图片描述

shell的作用是

解释执行用户输入的命令或程序等

用户输入⼀条命令,shell就解释⼀条

键盘输入命令,Linux给与响应的方式,称之为交互式

在这里插入图片描述

shell是⼀块包裹着系统核心的壳,处于操作系统的最外层,与用户直接对话,把用户的输入, 解释给操作系统,然后处理操作系统的输出结果,输出到屏幕给与用户看到结果。

从我们登录Linux,输入账号密码到进入Linux交互式界面,所有的操作,都是交给shell解释并执行

在这里插入图片描述

我们想要获取计算机的数据,不可能每次都编写程序,编译后,再运行,再得到我们想要的,例如你想找到⼀个文件,可以先写⼀段C语言的代码,然后调用系统函数,通过gcc编译后,运行程序才能找到文件。。。

因此有大牛开发出了shell解释器,能够让我们方便的使⽤Linux,例如只要敲下 ls -lh 这样的字符串,shell解释器就会针对这句话翻译,解释成 ls -l -h 然后执行,通过终端输出结果,无论是图形化或是命令行界面。

即使我们用的图形化,点点点的动作,区别也只是

命令行操作,shell解释执行后,输出结果到黑屏命令行界面

图形化操作,shell接受点击动作,输出图案数据

二、什么是shell脚本

当命令或者程序语句写在文件中,我们执行文件,读取其中的代码,这个程序文件就称之为shell脚本。

在shell脚本⾥定义多条Linux命令以及循环控制语句,然后将这些Linux命令⼀次性执行完毕,执行脚本文件的方式称之为,非交互式方式。

windows中存在 *.bat 批处理脚本

Linux中常用 *.sh 脚本文件

shell脚本规则

在Linux系统中,shell脚本或者称之为(bash shell程序)通常都是vim编辑,由Linux命令、bash shell指令、逻辑控制语句和注释信息组成。

Shebang

计算机程序中, shebang 指的是出现在文本文件的第⼀行前两个字符 #!

在Unix系统中,程序会分析 shebang 后面的内容,作为解释器的指令,例如

以 #!/bin/sh 开头的文件,程序在执行的时候会调用 /bin/sh ,也就是bash解释器

以 #!/usr/bin/python 开头的文件,代表指定python解释器去执行

以 #!/usr/bin/env 解释器名称 ,是⼀种在不同平台上都能正确找到解释器的办法

注意事项:

如果脚本未指定 shebang ,脚本执行的时候,默认用当前shell去解释脚本,即 $SHELL

如果 shebang 指定了可执行的解释器,如 /bin/bash /usr/bin/python ,脚本在执行时,文件名会作为参数传递给解释器

如果#!指定的解释程序没有可执行权限,则会报错“bad interpreter: Permission denied”。

如果#!指定的解释程序不是⼀个可执行文件,那么指定的解释程序会被忽略,转而交给当前的SHELL去执行这个脚本。

如果#!指定的解释程序不存在,那么会报错“bad interpreter: No such file or directory”。

#!之后的解释程序,需要写其绝对路径(如:#!/bin/bash),它是不会自动到$PATH中寻找解释器的。

如果你使用"bash test.sh"这样的命令来执行脚本,那么#!这⼀行将会被忽略掉,解释器当然是用命令行中显式指定的bash。

系统自带的bash脚本,开机启动脚本

[hdp@VM-12-6-centos ~]$ head -1 /etc/rc.d/init.d/network
#! /bin/bash

脚本注释,脚本开发规范

在shell脚本中,#后面的内容代表注释掉的内容,提供给开发者或使用者观看,系统会忽略此行

注释可以单独写⼀行,也可以跟在命令后面

尽量保持爱写注释的习惯,便于以后回顾代码的含义,尽量使用英文、而非中文

在这里插入图片描述

执行shell脚本的方式

bash script.sh 或 sh scripte.sh ,文件本身没权限执行,没x权限,则使用的方法,或脚本未指定shebang ,重点推荐的方式

使用 绝对/相对 路径执行脚本,需要文件含有x权限

source script.sh 或者 . script.sh ,代表 执行的含义,source等于点 .

少见的用法, sh < script.sh

shell和运维

shell脚本语言很适合处理纯文本类型数据,且Linux的哲学思想就是⼀切皆文件,如日志、配置文件、文本、⽹页文件,大多数都是纯文本类型的,因此shell可以方便的进行文本处理,好比强大的Linux三剑客(grep、sed、awk)

在这里插入图片描述

脚本语言

shell脚本语言属于⼀种弱类型语言 无需声明变量类型,直接定义使用

强类型语言,必须先定义变量类型,确定是数字、字符串等,之后再赋予同类型的值

centos7系统中支持的shell情况,有如下种类

[hdp@VM-12-6-centos ~]$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

默认的sh解释器

[hdp@VM-12-6-centos ~]$ ll /usr/bin/sh
lrwxrwxrwx 1 root root 4 Apr 22 23:30 /usr/bin/sh -> bash

其他脚本语言

在这里插入图片描述

PHP是⽹页程序语言,专注于Web页面开发,诸多开源产品,wordpress、discuz开源产品都是PHP开发

Perl语言,擅长支持强大的正则表达式,以及运维工具的开发

Python语言,明星语言,不仅适用于脚本程序开发,也擅长Web页面开发,如(系统后台,资产管理平台),爬⾍程序开发,大量Linux运维工具也由python开发,甚至于游戏开发也使用

shell的优势

虽然有诸多脚本编程语言,但是对于Linux操作系统内部应用而言,shell是最好的工具,Linux底层命令都支shell

语句,以及结合三剑客(grep、sed、awk)进行高级用法。

擅长系统管理脚本开发,如软件启停脚本、监控报警脚本、日志分析脚本

每个语言都有自己擅长的地方,扬长避短,达到高效运维的⽬的是最合适的。

Linux默认shell

[hdp@VM-12-6-centos ~]$ echo $SHELL
/bin/bash

三、shell基础知识

shell在系统的作用

ctrl + alt + f1~f7切换终端

echo $SHELL ,查看当前linux⽤的是哪⼀个版本的shell

编辑、执行命令

linux的命令是通过C语言开发的,例如 ls /opt ,看不到发生了什么,但是可以阅读bash源代码

linux命令提示符变量 $PS1

找到命令的帮助信息

help ls
man ls
info ls

如何执行shell脚本

前⾯登录Linux、都是执行交互的命令,最后exit退出系统

shell还可以通过非交互式操作,也就是脚本形式,从文件读取命令执行

source hello.sh
点 . hello.sh

shell脚本就是⼀个文件,写⼊你想执行的命令,就能执行、以及添加注释

注意,通过bash 命令运行脚本,会开启⼀个⼦shell

然而source和点,是内置命令,不会产生⼦shell

给脚本添加权限,使得像普通命令⼀样执行 chmod +x hello.sh

权限chmod、chown

重定向、管道符号

管道符号

command 1> output
重定向标准输出完整写法
例如,每次执行都会覆盖现有内容,这是shell语法,花括号,用分号隔开多个命令
{date;df -h;uptime;} > cc.output
---------------------------------------------
因此需要重定向追加输出符
command 1>> output
例如
echo "`date`" >> ./date.file
---------------------------------------------
标准输⼊
command < inputfile
[root@chaogelinux shell_programming]# cat < date.file
2021年 03⽉ 01⽇ 星期⼀ 15:38:04 CST
---------------------------------------------
标准错误输出
常用对错误输出的处理
command 1> standard.output 2>standard.error

command1|command2|command3

四、bash基础特性

bash是一个命令处理器,运行在文本窗口中,并能执行用户直接输入的命令

bash还能从文件中读取linux命令,称之为脚本

bash支持通配符、管道、命令替换、条件判断等逻辑控制语句

bash有诸多方便的功能,有助于运维⼈员提升工作效率

命令历史

Shell会保留其会话中用户提交执行的命令

history #命令,查看历史命令记录,注意【包含文件中和内存中的历史记录】
[hdp@VM-12-6-centos ~]$ echo $HISTSIZE  #shell进程可保留的命令历史的条数
3000
[hdp@VM-12-6-centos ~]$ echo $HISTFILE  #存放历史命令的文件,用户退出登录后,持久化命令个数
/home/hdp/.bash_history
[hdp@VM-12-6-centos ~]$ ls -a ~/.bash_history 
/home/hdp/.bash_history

history命令

history #命令 以及参数
-c: 清空内存中命令历史;
-r:从文件中恢复历史命令
数字 :显示最近n条命令 history 10

调用历史命令

!n #执行历史记录中的某n条命令
!! #执行上⼀次的命令,或者向上箭头
!string #执行名字以string开头的最近⼀次的命令

调用上⼀次命令的最后⼀个参数

ESC . #快捷键
!$

控制历史命令的环境变量

变量名:HISTCONTROL
ignoredups:忽略重复的命令;
ignorespace:忽略以空⽩字符开头的命令;
ignoreboth:以上两者同时生效;

bash特性汇总

文件路径tab键补全

命令补全

快捷键ctrl + a,e,u,k,l

通配符

命令历史

命令别名

命令行展开

变量含义

学生时代所学的数学方程式,如x=1,y=2,那会称之为x,y是未知数

对于计算机⻆度,x=1,y=2等于定义了两个变量,名字分别是x,y,且赋值了1和2

变量是暂时存储数据的地方,是⼀种数据标记(房间号,标记了客⼈所在的位置),数据存储在内容空间,通过调用正确的变量名字,即可取出对应的值。

在这里插入图片描述

shell变量

变量定义与赋值,注意变量与值之间不得有空格

name="lihua"
变量名
变量类型,bash默认把所有变量都认为是字符串
bash变量是弱类型,无需事先声明类型,是将声明和赋值同时进行

变量替换/引用

[hdp@VM-12-6-centos ~]$ name="我要开始学shell编程了"
[hdp@VM-12-6-centos ~]$ echo ${name}
我要开始学shell编程了
[hdp@VM-12-6-centos ~]$ echo $name  #可以省略花括号
我要开始学shell编程了

变量名规则

名称定义要做到见名知意,切按照规则来,切不得引用保留关键字(help检查保留字)

只能包含数字、字母、下划线

不能以数字开头

不能用标点符号

变量名严格区分大小写

变量的作用域

本地变量,只针对当前的shell进程

pstree检查进程树

在这里插入图片描述

切换shell变量丢失:

在这里插入图片描述

环境变量,也称为全局变量,针对当前shell以及其任意子进程,环境变量也分 自定义 、 内置 两种环境变量

局部变量,针对在 shell函数 或是 shell脚本 中定义

位置参数变量:用于 shell脚本 中传递的参数

特殊变量:shell内置的特殊功效变量
$?
0:成功
1-255:错误码

自定义变量
变量赋值: varName=value
变量引用: ${varName} $varName
双引号,变量名会替换为变量值

单引号,识别为普通字符串

[hdp@VM-12-6-centos ~]$[hdp@VM-12-6-centos ~]$ n1=1
[hdp@VM-12-6-centos ~]$ n2=2
[hdp@VM-12-6-centos ~]$ n3="$n1"
[hdp@VM-12-6-centos ~]$ echo $n3
1
[hdp@VM-12-6-centos ~]$ n4='$n2'
[hdp@VM-12-6-centos ~]$ echo $n4
$n2

不同的执行方式,不同的shell环境

[hdp@VM-12-6-centos ~]$ echo user1='lihua' > testsource.sh
[hdp@VM-12-6-centos ~]$ echo $user1

[hdp@VM-12-6-centos ~]$ sh testsource.sh
[hdp@VM-12-6-centos ~]$ echo $user1

[hdp@VM-12-6-centos ~]$ source testsource.sh
[hdp@VM-12-6-centos ~]$ echo $user1
lihua

使角sh解释器,执行脚本,是启动子shell去执行,完毕后回到父shell 无法保留变量

source或点.的方式执行脚本,是在当前shell环境执行脚本,保留变量

1.每次调⽤bash都会开启⼀个子shell,因此不保留当前的shell变量,通过 pstree 命令检查进程树

2.调⽤source是在当前shell环境加载脚本,因此保留变量

shell变量面试题

问,如下输入什么内容

[hdp@VM-12-6-centos ~]$ cat test.sh
user1=`whoami`
[hdp@VM-12-6-centos ~]$ sh test.sh
[hdp@VM-12-6-centos ~]$ echo $user1
A.当前用户
C.空

执行结果:

[hdp@VM-12-6-centos ~]$ vim test.sh 
[hdp@VM-12-6-centos ~]$ cat test.sh 
#!/usr/bin/bash
user1=`whoami`
[hdp@VM-12-6-centos ~]$ sh test.sh 
[hdp@VM-12-6-centos ~]$ echo $user1

这是因为我们使用sh 去执行test.sh会启动子shell去执行,完毕后回到父shell 无法保留变量

环境变量设置

环境变量⼀般指的是⽤export内置命令导出的变量,用于定义shell的运行环境、保证shell命令的正确执行。

shell通过环境变量确定登录的用户名、PATH路径、文件系统等各种应用。

环境变量可以在命令行中临时创建,但是用户退出shell终端,变量即丢失,如要永久生效,需要修改 环境变量配置文件

用户个⼈配置文件 ~/.bash_profile 、 ~/.bashrc 远程登录用户特有文件

全局配置文件 /etc/profile 、 /etc/bashrc ,且系统建议最好创建在 /etc/profile.d/ ,而非直接修改主文件,修改全局配置文件,影响所有登录系统的用户

检查系统环境变量的命令

set,输出所有变量,包括全局变量、局部变量

env,只显示全局变量

declare,输出所有的变量,如同set

export,显示和设置环境变量值

撤销环境变量

unset 变量名,删除变量或函数。

设置只读变量

readonly ,只有shell结束,只读变量失效

直接readonly 显示当前系统只读变量

[hdp@VM-12-6-centos ~]$ readonly name="lihua"
[hdp@VM-12-6-centos ~]$ name="123"
-bash: name: readonly variable

系统保留环境变量关键字

bash内嵌了诸多环境变量,用于定义bash的工作环境

[hdp@VM-12-6-centos ~]$ export | awk -F '[ :=]' '{print $3}'

这个命令的目的是输出当前 shell 中所有已定义的环境变量的名称。让我解释一下这个命令的每个部分:

1.export:这个命令用于显示所有已经设置的环境变量。

2.|:管道符号,将命令的输出传递给下一个命令。

3.awk:一个用于处理文本数据的强大工具。在这里,它用于解析输出并提取所需的信息。

4.-F '[ :=]'awk 命令的选项,指定了用于分割字段的分隔符。这里的意思是以空格、等号和冒号为分隔符。

5.'{print $3}':告诉 awk 打印每行的第三个字段。

因此,这个命令的输出将是当前 shell 中所有已定义的环境变量的名称。

bash多命令执行

[hdp@VM-12-6-centos ~]$ ls /data/;cd /tmp/;cd /home;cd /data

环境变量初始化与加载顺序

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椿融雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值