Shell的概念、shebang、bash的概念
什么是shell
shell的作用是
- 解释执行用户输入的命令或程序等
- 用户输入一条命令,shell就解释一条
- 键盘输入命令,Linux给与响应的方式,称之为交互式
linux的计算机是如何跟用户进行交互的?
- 用户输入了一条命令,像是ls、cat、pwd等命令,命令想要执行,会先发送给shell解释器,
- shell解释器是程序员开发出来的集成后的命令,他把ls、cat、cd等执行命令翻译给操作系统内核,进行系统调用
- linux内核再转换成二进制机器码,计算机就知道你真正的目的了,发起system call操作计算机硬件
- 计算机硬件只识别0101这样的计算机二进制数,那些固定的机器码。
- 具体实现了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的概念的更多相关文章
- linux shell中的 #!/bin/bash
#!/bin/bash是指此脚本使用/bin/bash来解释执行. 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径. bash只是shell的一种,还有很多其它shell,如:sh ...
- Shell第一篇:BASH 环境
一 什么是SHELL shell一般代表两个层面的意思,一个是命令解释器,比如BASH,另外一个就是shell脚本.本节我们站在命令解释器的角度来阐述shell 命令解释器SHELL的发展历史,SH- ...
- 转 关于shell脚本中#!/bin/bash and #!/bin/ksh 的说明
1.在文件里面输入一系列命令,可以直接执行吗? 可以.作者认为,这时调用的是当前用户默认使用的shell. 如果其中一个命令有错,后面的命令还是会继续执行下去的 如果说使用了”&& ...
- shell报错:-bash: [: ==: 期待一元表达式 解决方法 ([: ==: unary operator expected)
shell报错:-bash: [: ==: 期待一元表达式 解决方法 ([: ==: unary operator expected) blogdaren 2015-02-26 抢沙发 14916人 ...
- 『忘了再学』Shell基础 — 4、Bash基本功能(history命令)
目录 1.history历史命令 2.设置命令历史记录的条数 3.清空历史命令 4.历史命令的调用 5.命令与文件的补全 在Linux系统中默认的Shell就是Bourne-AgainShell(简称 ...
- shell基础之二 bash特性详解
https://blog.51cto.com/13520779/2093146 合格linux运维人员必会的30道shell编程面试题及讲解:https://blog.51cto.com/oldboy ...
- 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)
提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...
- shell脚本编程及bash特性
bash特性及bash脚本编程初步 终端,附着在终端的接口程序; GUI: KDE,GNome,Xfce CLI: /etc/shells bash的特性: 命令行展开: ~,{} 命令别名: ali ...
- JAVA理论概念大神之概念汇总
我个人觉得,JAVA之所以能够经久不衰,有一个很重要的原因就是:JAVA的理论总是给人一种,虽然不知道是什么,但是感觉很厉害的样子.就单是这一点,他就已经超越许多其他语言了,至少吹牛的时候谈资总是很多 ...
- ADF_ManagedBean的概念和管理(概念)
20150623 Created By BaoXinjian
随机推荐
- Text2Cypher:大语言模型驱动的图查询生成
话接上文<图技术在 LLM 下的应用:知识图谱驱动的大语言模型 Llama Index> 同大家简单介绍过 LLM 和图.知识图谱相关的结合,现在我来和大家分享下最新的成果.毕竟,从 GP ...
- Solution -「ZJOI 2014」力
Descrption Link. 对于每一个 \(i\),求出: \[\sum_{j=1}^{i-1}\frac{a_{j}}{(i-j)^{2}}-\sum_{j=i+1}^{n}\frac{a_{ ...
- daemonset应用创建了,但是没有pod被调度起来
环境: k8s版本1.25.2 一个master 两个node节点 集群节点全部允许调度(无污点),且资源充足. 操作系统版本: Ubuntu22.01 排查思路: 查看kubelet 日志,和c ...
- flask中cookies的使用
flask中cookies的使用 在Flask中对cookie的处理 1. 设置cookie: 设置cookie,默认有效期是临时cookie,浏览器关闭就失效 可以通过 max_age 设置有效期, ...
- 拦截|篡改|伪造.NET类库中不限于public的类和方法
大家好,我是沙漠尽头的狼. 本文首发于Dotnet9,介绍使用Lib.Harmony库拦截第三方.NET库方法,达到不修改其源码并能实现修改方法逻辑.预期行为的效果,并且不限于只拦截public访问修 ...
- JavaCore extends Plugin
/******************************************************************************* 2 * Copyright (c) 2 ...
- 教育法学第七章单元测试MOOC
第七章单元测试 返回 本次得分为:100.00/100.00, 本次测试的提交时间为:2020-09-06, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(5分) 父母对未成年子女 ...
- [SWPUCTF 2021 新生赛]老鼠走迷宫(详细版
附件下载 https://wwvc.lanzouj.com/iYLez1br84jg 解题思路 用pyinstxtrator解析exe 重点:将无后缀的5先修改后缀为pyc,然后随便找一个pyc文件补 ...
- MSFvenom恶意程序生成与利用
MSFvenom 1.1 MSFvenom介绍 MSFvenom是Msfpayload和Msfencode的组合,可以生成各种攻击载荷,并且可以对载荷进行编码.做渗透测试时往往需要将有效负载部署在目标 ...
- 人均瑞数系列,瑞数 6 代 JS 逆向分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容.敏感网址.数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许 ...