Linux Shell基础
文章目录
走进shell
在Linux早起,还没有出现图形化,超哥和其他系统管理员都只能坐在电脑前,输入shell命令,查看控制台的文本输出。
在大多数Linux发行版里,例如centos,可以简单的用组合键来访问Linux控制台,也就是ctrl+F1~F7
。
现在更多的使用xshell这样的控制终端,来连接管理我们的Linux机器。
以centos为例,默认的shell都是GNU bash shell
,支持一些特性,例如
- man手册
- tab补全
- shell指令
GNU bash shell
是在系统普通用户登陆时,作为普通程序运行,这个规则是/etc/passwd
中指定的条目
[root@chaogelinux ~]# tail -1 /etc/passwd
susu:x:2009:2010::/home/susu:/bin/bash
bash会在用户登录时候自动启动,如果是虚拟控制台终端登录,`命令行界面(英語:Command-Line Interface,缩写:CLI)提示符会自动出现,此时可以输入shell命令。
或者是通过图形化桌面登录Linux系统,你就需要启动GNOME这样的图形化终端仿真器来访问shell CLI。
什么是shell
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qz6f8mJB-1678231759689)(http://book.luffycity.com/linux-book/Shell%E7%BC%96%E7%A8%8B/pic/image-20191123173840375.png)]
shell的作用是
- 解释执行用户输入的命令或程序等
- 用户输入一条命令,shell就解释一条
- 键盘输入命令,Linux给与响应的方式,称之为交互式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XNS6WGFt-1678231759692)(http://book.luffycity.com/linux-book/Shell%E7%BC%96%E7%A8%8B/pic/image-20191123175043170.png)]
shell是一块包裹着系统核心的壳,处于操作系统的最外层,与用户直接对话,把用户的输入,解释
给操作系统,然后处理操作系统的输出结果,输出到屏幕给与用户看到结果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rbm1fhNd-1678231759693)(http://book.luffycity.com/linux-book/Shell%E7%BC%96%E7%A8%8B/pic/image-20191123175245031.png)]
从我们登录Linux,输入账号密码到进入Linux交互式界面,所有的操作,都是交给shell解释并执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BLIAf5CX-1678231759694)(http://book.luffycity.com/linux-book/Shell%E7%BC%96%E7%A8%8B/pic/image-20191123181307432.png)]
我们想要获取计算机的数据,不可能每次都编写程序,编译后,再运行,再得到我们想要的,例如你想找到一个文件,可以先写一段C语言的代码,然后调用系统函数,通过gcc编译后,运行程序才能找到文件。。。
因此有大牛开发出了shell解释器,能够让我们方便的使用Linux,例如只要敲下ls -lh
这样的字符串,shell解释器就会针对这句话翻译,解释成ls -l -h
然后执行,通过终端输出结果,无论是图形化或是命令行界面。
即使我们用的图形化,点点点的动作,区别也只是
- 命令行操作,shell解释执行后,输出结果到黑屏命令行界面
- 图形化操作,shell接受点击动作,输出图案数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nL6MHCX1-1678231759694)(http://book.luffycity.com/linux-book/Shell%E7%BC%96%E7%A8%8B/pic/image-20191123182543822.png)]
shell和运维
shell脚本语言很适合处理纯文本类型数据,且Linux的哲学思想就是一切皆文件,如日志、配置文件、文本、网页文件,大多数都是纯文本类型的,因此shell可以方便的进行文本处理,好比强大的Linux三剑客(grep、sed、awk)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U3p5r2DF-1678231759696)(http://book.luffycity.com/linux-book/Shell%E7%BC%96%E7%A8%8B/pic/image-20191123190656011.png)]
什么是shell脚本
当命令或者程序语句写在文件中,我们执行文件,读取其中的代码,这个程序文件就称之为shell脚本。
在shell脚本里定义多条Linux命令以及循环控制语句,然后将这些Linux命令一次性执行完毕,执行脚本文件的方式称之为,非交互式方式。
- windows中存在
*.bat
批处理脚本 - Linux中常用
*.sh
脚本文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W8NdPYkB-1678231759697)(http://book.luffycity.com/linux-book/Shell%E7%BC%96%E7%A8%8B/pic/image-20191123184851684.png)]
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。
脚本案例
[root@chaogelinux data]# cat test.sh
#!/bin/bash
echo "超哥强呀,奥力给"
#!/bin/bash 这里就是注释的作用了
系统自带的bash脚本,开机启动脚本
[root@chaogelinux data]# head -1 /etc/rc.d/init.d/network
#! /bin/bash
脚本注释,脚本开发规范
- 在shell脚本中,#后面的内容代表注释掉的内容,提供给开发者或使用者观看,系统会忽略此行
- 注释可以单独写一行,也可以跟在命令后面
- 尽量保持爱写注释的习惯,便于以后回顾代码的含义,尽量使用英文、而非中文
#! /bin/bash
# Date : 2019-11-28 14:59:18
# Author:created by chaoge
# Blog:www.cnblogs.com/pyyu
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1327N1wo-1678231759698)(http://book.luffycity.com/linux-book/Shell%E7%BC%96%E7%A8%8B/pic/image-20191128145816847.png)]
执行shell脚本的方式
bash script.sh
或sh scripte.sh
,文件本身没权限执行,没x权限,则使用的方法,或脚本未指定shebang
,重点推荐的方式- 使用
绝对/相对
路径执行脚本,需要文件含有x权限 source script.sh
或者. script.sh
,代表执行的含义,source等于点.
- 少见的用法,
sh < script.sh
[root@chaogelinux data]# cat test.sh
#!/bin/bash
echo "超哥强呀,奥力给"
#!/bin/bash 这里就是注释的作用了
[root@chaogelinux data]#
[root@chaogelinux data]#
[root@chaogelinux data]# sh < test.sh
超哥强呀,奥力给
[root@chaogelinux data]# sh test.sh
超哥强呀,奥力给
[root@chaogelinux data]# bash test.sh
超哥强呀,奥力给
[root@chaogelinux data]# source test.sh
超哥强呀,奥力给
[root@chaogelinux data]# . /data/test.sh
超哥强呀,奥力给
权限不足
[root@chaogelinux data]# ./test.sh
-bash: ./test.sh: 权限不够
[root@chaogelinux data]# chmod +x test.sh
[root@chaogelinux data]# ./test.sh
超哥强呀,奥力给
脚本语言
shell脚本语言属于一种弱类型语言无需声明变量类型,直接定义使用
强类型语言,必须先定义变量类型,确定是数字、字符串等,之后再赋予同类型的值
centos7系统中支持的shell情况,有如下种类
[root@chaogelinux ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
默认的sh解释器
[root@chaogelinux ~]# ll /usr/bin/sh
lrwxrwxrwx 1 root root 4 11月 16 10:48 /usr/bin/sh -> bash
其他脚本语言
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aomfJTfa-1678231759699)(http://book.luffycity.com/linux-book/Shell%E7%BC%96%E7%A8%8B/pic/image-20191123192209371.png)]
- PHP是网页程序语言,专注于Web页面开发,诸多开源产品,wordpress、discuz开源产品都是PHP开发
- Perl语言,擅长支持强大的正则表达式,以及运维工具的开发
- Python语言,明星语言,不仅适用于脚本程序开发,也擅长Web页面开发,如(系统后台,资产管理平台),爬虫程序开发,大量Linux运维工具也由python开发,甚至于游戏开发也使用
shell的优势
虽然有诸多脚本编程语言,但是对于Linux操作系统内部应用而言,shell是最好的工具,Linux底层命令都支持shell语句,以及结合三剑客(grep、sed、awk)进行高级用法。
- 擅长系统管理脚本开发,如软件启停脚本、监控报警脚本、日志分析脚本
每个语言都有自己擅长的地方,扬长避短,达到高效运维的目的是最合适的。
#Linux默认shell
[root@chaogelinux ~]# echo $SHELL
/bin/bash
bash基础特性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LdFLle3P-1678231759699)(http://book.luffycity.com/linux-book/Shell%E7%BC%96%E7%A8%8B/pic/image-20191123200441836.png)]
bash有诸多方便的功能,有助于运维人员提升工作效率
命令历史
Shell会保留其会话中用户提交执行的命令
history #命令,查看历史命令记录,注意【包含文件中和内存中的历史记录】
[root@chaogelinux ~]# echo $HISTSIZE #shell进程可保留的命令历史的条数
3000
[root@chaogelinux ~]# echo $HISTFILE #存放历史命令的文件,用户退出登录后,持久化命令个数
/root/.bash_history
#存放历史命令的文件
[root@chaogelinux ~]# ls -a ~/.bash_history
/root/.bash_history
history命令
history #命令 以及参数
-c: 清空内存中命令历史;
-r:从文件中恢复历史命令
数字 :显示最近n条命令 history 10
例子:
#清空内存中命令历史
[root@localhost ~]# history -c
#从文件中恢复历史命令
[root@localhost ~]# history -r ~/.bash_history
调用历史命令
!n #执行历史记录中的某n条命令
!! #执行上一次的命令,或者向上箭头
!string #执行名字以string开头的最近一次的命令
调用上一次命令的最后一个参数
ESC . #快捷键
!$
控制历史命令的环境变量
变量名:HISTCONTROL
ignoredups:忽略重复的命令;
ignorespace:忽略以空白字符开头的命令;
ignoreboth:以上两者同时生效;
[root@chaogelinux ~]# HISTCONTROL=ignoreboth
[root@chaogelinux ~]# echo $HISTCONTROL
ignoreboth
[root@chaogelinux ~]# history
bash特性汇总
- 文件路径tab键补全
- 命令补全
- 快捷键ctrl + a,e,u,k,l
- 通配符
- 命令历史
- 命令别名
- 命令行展开