Shell的概念、shebang、bash的概念

什么是shell

shell的作用是

  • 解释执行用户输入的命令或程序等
  • 用户输入一条命令,shell就解释一条
  • 键盘输入命令,Linux给与响应的方式,称之为交互式

linux的计算机是如何跟用户进行交互的?

  1. 用户输入了一条命令,像是ls、cat、pwd等命令,命令想要执行,会先发送给shell解释器,
  2. shell解释器是程序员开发出来的集成后的命令,他把ls、cat、cd等执行命令翻译给操作系统内核,进行系统调用
  3. linux内核再转换成二进制机器码,计算机就知道你真正的目的了,发起system call操作计算机硬件
  4. 计算机硬件只识别0101这样的计算机二进制数,那些固定的机器码。
  5. 具体实现了shell的软件叫做bash,还有其他的编程语言

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

像ls这样的系统操作命令,当初是由C语音开发而来,编译后生成二进制命令,让系统识别,最终生成了ls的系统命令

ls在/usr/bin目录下

root@zys-t02:/root#which ls
alias ls='ls --color=auto'
	/usr/bin/ls
root@zys-t02:/root#

像这些/usr/bin目录下的绿色文件,均为二进制文件

ls输出的颜色有以下几种:

白色:表示普通文件
蓝色:表示目录
绿色:表示可执行文件
红色:表示压缩文件
浅蓝色:链接文件
红色闪烁:表示链接的文件有问题
黄色:表示设备文件
灰色:表示其他文件
这是linux系统约定的默认颜色,你也可以根据自己喜好自己修改
在环境变量$LS_COLORS上修改就行,想永久保存就在~/.bashrc里改

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

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

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

  • 命令行操作,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脚本,开机启动脚本

 

脚本注释,脚本开发规范

在shell脚本中,#后面的内容代表注释掉的内容,提供给开发者或使用者观看,系统会忽略此行
注释可以单独写一行,也可以跟在命令后面
尽量保持爱写注释的习惯,便于以后回顾代码的含义,尽量使用英文、而非中文

执行shell脚本的方式

  • bash script.sh或sh scripte.sh,文件本身没权限执行,没x权限,则使用的方法,或脚本未指定shebang,重点推荐的方式
  • 使用绝对/相对 路径执行脚本,需要文件含有x权限
  • source script.sh 或者 .script.sh,代表 执行的含义,source等于点.
  • 少见的用法,sh < script.sh   #"bash"重定向写入"<",数据流为"script.sh"


shell和运维的关系是

shell脚本主要是系统管理员来使用,维护操作系统和处理各种文本数据使用的。

Linux系统一切皆文件,因此Shell脚本主要用来处理系统文本文件。

shell是C语言开发的,和系统的兼容性最大,与其他命令统计的脚本对比,shell脚本的执行效率也是最高的(对大文件进行去重、排序、统计、格式化等操作)。

巧妙的使用三剑客(grep、sed、awk)能使管理员维护更高效。

 

脚本语言

Shell(希尔)脚本属于弱类型编程语言,无需声明变量类型,直接定义使用

数据类型默认都是字符串类型

弱类型编程语言,在定义变量的时候,不用主动声明改类型

比如:Shell、Python

shell.    name=28 或者 name="jack"
Python.    name=29

 

强类型编程语言,就需要指定变量的数据类型,必须得对应上否则报错,

比如:golang、c语言

name 名字变量,字符串类型数据,string name="jack"
age 年龄,数字存储最好, int age=6

在字符串中输入数字就会报错比如

 string name=28

 

在CentOS7中支持的Shell脚本包含如下

root@zys-t02:/root#cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

CentOS7默认的sh解释器被软连接为bash

root@zys-t02:/root#ll /usr/bin/sh
lrwxrwxrwx. 1 root root 4 Sep 20  2019 /usr/bin/sh -> bash

Ubuntu默认的sh解释器被软连接为dash

root@TKE-NODE-T20:~# ll /bin/sh
lrwxrwxrwx 1 root root 4 Jul 19  2019 /bin/sh -> dash*

 

其他相关编程语言的理念

各种语言的占比——脑图

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

Perl语言,擅长支持强大的正则表达式,以及运维工具的开发 (国外程序员使用较多,国内较少)

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

 

shell的优势

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

擅长系统管理脚本开发,如软件启停脚本、监控报警脚本、日志分析脚本每个语言都有自己擅长的地方,扬长避短,达到高效运维的目的是最合适的。

Linux默认Shell

root@zys-t02:/root#echo $SHELL
/bin/bash

 

bash基础特性

bash是什么

bash是一个命令处理器,运行在文本窗口中,并能执行用户直接输入的命令
bash还能从文件中读取linxu命令,称之为脚本
bash支持通配符、管道、命令替换、条件判断等逻辑控制语句

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


 

命令历史

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

history命令:查看历史

history    #命令 以及参数
-c:清空内存中命令历史;
-r:从文件中恢复历史命令
数字:显示最近n条命令     history 10
history    #查看历史命令记录,注意【包含文件中和内存中的历史记录】

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

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

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

修改历史命令的配置路径/etc/proflie

root@zys-t02:/root#cat /etc/profile |grep -n "^HISTSIZE"
90:HISTSIZE=3000

删除、恢复历史命令

viewer@zys-t02:/#cat ~/.bash_history    #查看.bash_history文件内的内容
df -h
shutdown -h
vim ~/.bash_history
pwd
ls -a
exit
viewer@zys-t02:/#history -c    #清空history命令
viewer@zys-t02:/#history       #history内变成空
    1  history
viewer@zys-t02:/#cat ~/.bash_history    #查看当前用户的路径下的.bash_history文件内的内容,内容未消失
df -h
shutdown -h
vim ~/.bash_history
pwd
ls -a
exit
viewer@zys-t02:/#history -r ~/.bash_history    #恢复history命令内容,从.bash_history文件导入
viewer@zys-t02:/#history    #history内容恢复
    1  history
    2  cat ~/.bash_history
    3  history -r ~/.bash_history
    4  df -h
    5  shutdown -h
    6  vim ~/.bash_history
    7  pwd
    8  ls -a
    9  exit
   10  history
viewer@zys-t02:/#

#查看当前用户的路径下的.bash_history文件

viewer@zys-t02:/#cat ~/.bash_history
#或是
viewer@zys-t02:/#cat /home/viewer/.bash_history

注1:每个用户的配置文件都保存在各自用户目录下,此时登录的用户为viewer,此处的~代表/home/viewer路径。

注2:.bash_history文件为隐藏文件,需要使用ls -a命令查看

viewer@zys-t02:/#cd /home/viewer/
viewer@zys-t02:/home/viewer#ls -a
.   .bash_history  .bash_profile  .cache   .dbus    Documents  .esd_auth      .local    Music     Public     Videos
..  .bash_logout   .bashrc        .config  Desktop  Downloads  .ICEauthority  .mozilla  Pictures  Templates  .viminfo
viewer@zys-t02:/home/viewer#

!加历史ID,可以快速执行历史命令,例如:!5

!!是执行最后一步命令和使用↑箭头等同

 

 centos7中常用的快捷键有以下几种

1.Ctrl + c
centos7中Ctrl + c快捷键的作用是取消当前操作,常用于清屏。
2.Tab
centos7中Tab快捷键的作用是获取提示,常用于获取命令提示。
3.Ctrl + d
centos7中Ctrl + d快捷键的作用是退出系统登录。
4.ctrl + a
centos7中ctrl + a快捷键的作用是光标回到首行。
5.ctrl + u
centos7中ctrl + u快捷键的作用是从首行删除到光标处,不包括该光标元素。
6.ctrl + e
centos7中ctrl + e快捷键的作用是光标回到尾行。
7.ctrl + k
centos7中ctrl + k快捷键的作用是从光标处删除到尾行,包括该光标元素。

 

posted @ 2023-02-01 10:45  Magiclala  阅读(533)  评论(0编辑  收藏  举报