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