什么是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快捷键的作用是从光标处删除到尾行,包括该光标元素。

Shell的概念、shebang、bash的概念的更多相关文章

  1. linux shell中的 #!/bin/bash

    #!/bin/bash是指此脚本使用/bin/bash来解释执行. 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径. bash只是shell的一种,还有很多其它shell,如:sh ...

  2. Shell第一篇:BASH 环境

    一 什么是SHELL shell一般代表两个层面的意思,一个是命令解释器,比如BASH,另外一个就是shell脚本.本节我们站在命令解释器的角度来阐述shell 命令解释器SHELL的发展历史,SH- ...

  3. 转 关于shell脚本中#!/bin/bash and #!/bin/ksh 的说明

      1.在文件里面输入一系列命令,可以直接执行吗? 可以.作者认为,这时调用的是当前用户默认使用的shell. 如果其中一个命令有错,后面的命令还是会继续执行下去的 如果说使用了”&& ...

  4. shell报错:-bash: [: ==: 期待一元表达式 解决方法 ([: ==: unary operator expected)

    shell报错:-bash: [: ==: 期待一元表达式 解决方法 ([: ==: unary operator expected) blogdaren 2015-02-26  抢沙发 14916人 ...

  5. 『忘了再学』Shell基础 — 4、Bash基本功能(history命令)

    目录 1.history历史命令 2.设置命令历史记录的条数 3.清空历史命令 4.历史命令的调用 5.命令与文件的补全 在Linux系统中默认的Shell就是Bourne-AgainShell(简称 ...

  6. shell基础之二 bash特性详解

    https://blog.51cto.com/13520779/2093146 合格linux运维人员必会的30道shell编程面试题及讲解:https://blog.51cto.com/oldboy ...

  7. 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

    提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...

  8. shell脚本编程及bash特性

    bash特性及bash脚本编程初步 终端,附着在终端的接口程序; GUI: KDE,GNome,Xfce CLI: /etc/shells bash的特性: 命令行展开: ~,{} 命令别名: ali ...

  9. JAVA理论概念大神之概念汇总

    我个人觉得,JAVA之所以能够经久不衰,有一个很重要的原因就是:JAVA的理论总是给人一种,虽然不知道是什么,但是感觉很厉害的样子.就单是这一点,他就已经超越许多其他语言了,至少吹牛的时候谈资总是很多 ...

  10. ADF_ManagedBean的概念和管理(概念)

    20150623 Created By BaoXinjian

随机推荐

  1. c语言代码练习4(改进)

    #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <wi ...

  2. go使用snmp库查询mib数据

    转载请注明出处: OID(Object Identifier)是一种用于标识和唯一命名管理信息库中的对象的标准方式.给定一个OID,可以确定特定的管理信息库对象,并对其进行操作. go语言使用snmp ...

  3. Go 函数的健壮性、panic异常处理、defer 机制

    Go 函数的健壮性.panic异常处理.defer 机制 目录 Go 函数的健壮性.panic异常处理.defer 机制 一.函数健壮性的"三不要"原则 1.1 原则一:不要相信任 ...

  4. Redis的速度不够用?为什么你应该考虑使用 KeyDB,一个更快、更强大、更灵活的开源数据库

    你是否正在使用 Redis 作为您的数据结构存储,享受它的高性能.高可用的特性?如果是这样,那么你可能会对 KeyDB 感兴趣. 什么是 KeyDB? KeyDB 一个由 Snap 提供支持.专为扩展 ...

  5. Chromium GPU资源共享

    资源共享指的是在一个 Context 中的创建的 Texture 资源可以被其他 Context 所使用.一般来讲只有相同 share group Context 创建的 Texture 才可以被共享 ...

  6. 如何打开关闭Edge鼠标手势

    概述 今天突然发现edge有了一个鼠标手势,用起来不是很适应,所以决定将其关掉. 操作步骤 点击edge右上角的三个点 在下拉菜单中选择设置 点开设置之后出现如图所示的界面,然后选择外观 往下面拉页面 ...

  7. Linux发行版部分时间线

  8. http协议与apache

    http协议与apache 1.httpd协议 两台主机通信需要socket文件  yum insatll -y nc  ​  [root@localhost ~]#nc -l 8000  #主机1 ...

  9. QString类常用属性

    目录 1. isNull() 2. isEmpty() 3. length() 4. truncate() 5. indexOf()/lastIndexOf() 6. arg() 7. at() 8. ...

  10. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-29-处理日历时间控件-中篇

    1.简介 上一篇的日历时间控件宏哥介绍的比较传统也是很常见的.宏哥不能说它很low,但是相比较一些高端.大气.上档次的日历时间控件,结果就一目了然了:确实很low. 2.被测网站 2.1高大上日历时间 ...