系统相关
首页 > 系统相关> > Shell编程

Shell编程

作者:互联网

什么是shell

image-20191123173840375

shell的作用是

image-20191123175043170

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

image-20191123175245031

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

image-20191123181307432

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

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

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

image-20191123182543822

什么是shell脚本

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

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

image-20191123184851684

shell脚本规则

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

Shebang

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

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

注意事项:

脚本案例

[root@chaogelinux data]# cat test.sh
#!/bin/bash
echo "超哥强呀,奥力给"
#!/bin/bash 这里就是注释的作用了

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

[root@chaogelinux data]# head -1 /etc/rc.d/init.d/network
#! /bin/bash

脚本注释,脚本开发规范

#! /bin/bash

# Date : 2019-11-28 14:59:18
# Author:created by chaoge
# Blog:www.cnblogs.com/pyyu

image-20191128145816847

执行shell脚本的方式

[root@chaogelinux data]# cat test.sh
#!/bin/bash
echo "超哥强呀,奥力给"
#!/bin/bash 这里就是注释的作用了
[root@chaogelinux data]#
[root@chaogelinux data]#
[root@chaogelinux data]# sh < test.sh
超哥强呀,奥力给
[root@chaogelinux data]# sh test.sh
超哥强呀,奥力给
[root@chaogelinux data]# bash test.sh
超哥强呀,奥力给
[root@chaogelinux data]# source test.sh
超哥强呀,奥力给
[root@chaogelinux data]# . /data/test.sh
超哥强呀,奥力给


权限不足
[root@chaogelinux data]# ./test.sh
-bash: ./test.sh: 权限不够
[root@chaogelinux data]# chmod +x test.sh
[root@chaogelinux data]# ./test.sh
超哥强呀,奥力给

shell和运维

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

image-20191123190656011

脚本语言

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

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

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

[root@chaogelinux ~]# cat /etc/shells  
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

默认的sh解释器

[root@chaogelinux ~]# ll /usr/bin/sh
lrwxrwxrwx 1 root root 4 11月 16 10:48 /usr/bin/sh -> bash

其他脚本语言

image-20191123192209371

shell的优势

虽然有诸多脚本编程语言,但是对于Linux操作系统内部应用而言,shell是最好的工具,Linux底层命令都支持shell语句,以及结合三剑客(grep、sed、awk)进行高级用法。

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

#Linux默认shell
[root@chaogelinux ~]# echo $SHELL
/bin/bash

bash基础特性

image-20191123200441836

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

命令历史

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

history    #命令,查看历史命令记录,注意【包含文件中和内存中的历史记录】

[root@chaogelinux ~]# echo $HISTSIZE    #shell进程可保留的命令历史的条数
3000

[root@chaogelinux ~]# echo $HISTFILE        #存放历史命令的文件,用户退出登录后,持久化命令个数
/root/.bash_history

#存放历史命令的文件
[root@chaogelinux ~]# ls -a ~/.bash_history
/root/.bash_history

history命令

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

调用历史命令

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

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

ESC .   #快捷键
!$

控制历史命令的环境变量

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

[root@chaogelinux ~]# HISTCONTROL=ignoreboth
[root@chaogelinux ~]# echo $HISTCONTROL
ignoreboth

[root@chaogelinux ~]# history

bash特性汇总

变量含义

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

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

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

image-20191123202024993

image-20191123203516529

shell变量

name="超哥"

变量名
变量类型,bash默认把所有变量都认为是字符串

bash变量是弱类型,无需事先声明类型,是将声明和赋值同时进行
[root@chaogelinux ~]# name="超哥带你学bash"
[root@chaogelinux ~]# echo ${name}
超哥带你学bash
[root@chaogelinux ~]# echo $name    #可以省略花括号
超哥带你学bash
有效的变量名:
NAME_CHAOGE
_chaoge
chaoge1
chaogE1
Chao2_ge

无效的变量名:
?chaoge
chao*ge
chao+ge

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

[root@chaogelinux data]# echo user1='超哥' > testsource.sh
[root@chaogelinux data]# echo $user1

[root@chaogelinux data]# sh testsource.sh
[root@chaogelinux data]# echo $user1

[root@chaogelinux data]# source testsource.sh
[root@chaogelinux data]# echo $user1
超哥

image-20191128143311747

解答:

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

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

shell变量面试题

问,如下输入什么内容

[root@chaogelinux data]# cat test.sh
user1=`whoami`
[root@chaogelinux data]# sh test.sh
[root@chaogelinux data]# echo $user1

A.当前用户
B.超哥
C.空

环境变量设置

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

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

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

检查系统环境变量的命令

撤销环境变量

设置只读变量

直接readonly 显示当前系统只读变量
[root@chaogelinux ~]# readonly name="超哥"
[root@chaogelinux ~]# name="chaochao"
-bash: name: 只读变量

系统保留环境变量关键字

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

[root@chaogelinux ~]# export |awk -F '[ :=]' '{print $3}'

bash多命令执行

[root@chaogelinux home]# ls /data/;cd /tmp/;cd /home;cd /data

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

image-20200319102558364

标签:shell,data,编程,sh,Shell,chaogelinux,root,bash
来源: https://www.cnblogs.com/xiaohaoge/p/16444939.html