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
随机推荐
- c语言代码练习4(改进)
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <wi ...
- go使用snmp库查询mib数据
转载请注明出处: OID(Object Identifier)是一种用于标识和唯一命名管理信息库中的对象的标准方式.给定一个OID,可以确定特定的管理信息库对象,并对其进行操作. go语言使用snmp ...
- Go 函数的健壮性、panic异常处理、defer 机制
Go 函数的健壮性.panic异常处理.defer 机制 目录 Go 函数的健壮性.panic异常处理.defer 机制 一.函数健壮性的"三不要"原则 1.1 原则一:不要相信任 ...
- Redis的速度不够用?为什么你应该考虑使用 KeyDB,一个更快、更强大、更灵活的开源数据库
你是否正在使用 Redis 作为您的数据结构存储,享受它的高性能.高可用的特性?如果是这样,那么你可能会对 KeyDB 感兴趣. 什么是 KeyDB? KeyDB 一个由 Snap 提供支持.专为扩展 ...
- Chromium GPU资源共享
资源共享指的是在一个 Context 中的创建的 Texture 资源可以被其他 Context 所使用.一般来讲只有相同 share group Context 创建的 Texture 才可以被共享 ...
- 如何打开关闭Edge鼠标手势
概述 今天突然发现edge有了一个鼠标手势,用起来不是很适应,所以决定将其关掉. 操作步骤 点击edge右上角的三个点 在下拉菜单中选择设置 点开设置之后出现如图所示的界面,然后选择外观 往下面拉页面 ...
- Linux发行版部分时间线
- http协议与apache
http协议与apache 1.httpd协议 两台主机通信需要socket文件 yum insatll -y nc [root@localhost ~]#nc -l 8000 #主机1 ...
- QString类常用属性
目录 1. isNull() 2. isEmpty() 3. length() 4. truncate() 5. indexOf()/lastIndexOf() 6. arg() 7. at() 8. ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-29-处理日历时间控件-中篇
1.简介 上一篇的日历时间控件宏哥介绍的比较传统也是很常见的.宏哥不能说它很low,但是相比较一些高端.大气.上档次的日历时间控件,结果就一目了然了:确实很low. 2.被测网站 2.1高大上日历时间 ...