什么是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. Text2Cypher:大语言模型驱动的图查询生成

    话接上文<图技术在 LLM 下的应用:知识图谱驱动的大语言模型 Llama Index> 同大家简单介绍过 LLM 和图.知识图谱相关的结合,现在我来和大家分享下最新的成果.毕竟,从 GP ...

  2. Solution -「ZJOI 2014」力

    Descrption Link. 对于每一个 \(i\),求出: \[\sum_{j=1}^{i-1}\frac{a_{j}}{(i-j)^{2}}-\sum_{j=i+1}^{n}\frac{a_{ ...

  3. daemonset应用创建了,但是没有pod被调度起来

    环境: k8s版本1.25.2  一个master  两个node节点 集群节点全部允许调度(无污点),且资源充足. 操作系统版本: Ubuntu22.01 排查思路: 查看kubelet 日志,和c ...

  4. flask中cookies的使用

    flask中cookies的使用 在Flask中对cookie的处理 1. 设置cookie: 设置cookie,默认有效期是临时cookie,浏览器关闭就失效 可以通过 max_age 设置有效期, ...

  5. 拦截|篡改|伪造.NET类库中不限于public的类和方法

    大家好,我是沙漠尽头的狼. 本文首发于Dotnet9,介绍使用Lib.Harmony库拦截第三方.NET库方法,达到不修改其源码并能实现修改方法逻辑.预期行为的效果,并且不限于只拦截public访问修 ...

  6. JavaCore extends Plugin

    /******************************************************************************* 2 * Copyright (c) 2 ...

  7. 教育法学第七章单元测试MOOC

    第七章单元测试 返回 本次得分为:100.00/100.00, 本次测试的提交时间为:2020-09-06, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(5分) 父母对未成年子女 ...

  8. [SWPUCTF 2021 新生赛]老鼠走迷宫(详细版

    附件下载 https://wwvc.lanzouj.com/iYLez1br84jg 解题思路 用pyinstxtrator解析exe 重点:将无后缀的5先修改后缀为pyc,然后随便找一个pyc文件补 ...

  9. MSFvenom恶意程序生成与利用

    MSFvenom 1.1 MSFvenom介绍 MSFvenom是Msfpayload和Msfencode的组合,可以生成各种攻击载荷,并且可以对载荷进行编码.做渗透测试时往往需要将有效负载部署在目标 ...

  10. 人均瑞数系列,瑞数 6 代 JS 逆向分析

    声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容.敏感网址.数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许 ...