shell基础

shell

什么是shell

shell的作用是

  • 解释执行用户输入的命令或程序等
  • 用户输入一条命令,shell就解释一条
  • 键盘输入命令,linxu给与响应的方式,称之为交互

image-20220908154054942

shell是一块包裹着系统核心的壳,处于操作系统的最外层,与用户直接对话,把用户的输入,解释给操作系统,然后处理操作系统输出结果,输出到屏幕给与用户看到结果

[root@xuexi3 /]# echo "biangbiangbiang"
biangbiangbiang

从我们登录linux,输入账号密码进入到linux交互界面,所有的操作,都是交给shell解释并执行

image-20220908154623281

我们想要获取计算机的数据,不能每次都编写程序,编译后在运行,在得到我们想要的,例如你想找到一个文件,可以先写一段c语言的代码,然后调用系统函数,通过gcc编译后,运行程序才能找到文件。。。

因此有大牛开发出了shell解释器,能够让我们方便的使用linux,例如只要敲下ls -lh这样的字符串,shell解释器就会针对这句话繁育,解释成ls -l -h 然后执行,通过终端输出结果,无论是图形化或者是命令化界面。

解释我们用的图形化,点点点的动作,区别也只是

  • 命令行操作,shell解释执行后,输出结果到黑屏命令行界面
  • 图形化操作,shell接受点击动作,输出图案数据

什么是shell脚本

当命令或者程序语句卸载文件中,我们执行文件,读取其中的代码,这个程序文件就称之为shell脚本

在shell脚本里定义多条linux命令以及循环控制语句,然后将这些linux命令一次性执行完毕,执行脚本文件的方式称之为非交互方式

  • 在windowa中存在*.bat批处理脚本
  • 在linux中常用*.sh脚本文件
显示
[root@xuexi3 data]# vim mytestshell.sh
[root@xuexi3 data]# cat /opt/data/testshell/
cat: /opt/data/testshell/: 是一个目录
[root@xuexi3 data]# cat mytestshell.sh 
touch /opt/data/testshell/myshell2.xtx
[root@xuexi3 data]# vim mytestshell.sh     #编辑 touch /opt/data/testshell/myshell2
[root@xuexi3 data]# /usr/bin/bash  ./mytestshell.sh 
[root@xuexi3 data]# ls /opt/data/testshell/
myshell2.txt  myshell.txt

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),他是不会自动到$PASH中寻找解释器的
  • 如果你使用“bash test.sh”这样的命令来执行脚本,那么#!这一行将会被忽略掉,解释器当然是用命令行中显示指定的bash

脚本注释,脚本开发规范

  • 在shell脚本中,#后面的内容代表注释掉的内容,提供给开发者或者使用者观看,系统会忽略此行
  • 注释可以单独写一行,也可以跟在命令后
  • 尽量保持爱写注释的习惯,便于以后回顾代码的含义,尽量使用英文,而非中文

执行shell脚本的方式

  • bash script.sh 或sh scripte.sh文件本身没权限执行,没x权限,则使用的方法,或脚本未指定shebang,重点推荐的方式
  • 使用绝对/相对路径执行脚本,需要文件含有X权限
  • source script.sh或者script.sh,代表执行的含义,source等于点
  • 少见的用法,==sh < script.sh
[root@xuexi3 data]# chmod u+x myshell.sh #赋予可执行权限(变绿成可执行文件)
[root@xuexi3 data]# ls
myshell.sh
[root@xuexi3 data]# chmod  u-x myshell.sh  #取消可执行权限(变白成文件)
[root@xuexi3 data]# ls
myshell.sh

shell和运维

shell脚本语言很适合处理纯文本类型数据,且linux的哲学思想就是一切皆文件,如日志、配置文件、文本、网页文件,大多数都是纯文本类型,因此shell可以方便的进行文本梳理,好比强大的linux三剑客(gerp、sed、awk)

image-20220909112551331

脚本语言

shell脚本语言属于一种弱类型语言 无需声明变量类型,直接定义使用

强类型语言,必须先定义变量类型,确定是数字,字符串等,之后在赋予同类型的值

centos7系统中支持的shell情况,有如下种类

[root@xuexi3 /]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

默认的sh解释器

[root@xuexi3 /]# ll /usr/bin/sh
lrwxrwxrwx. 1 root root 4 8月  16 14:33 /usr/bin/sh -> bash

其他脚本语言

  • php是网页程序语言,专注于web页面开发,诸多开源产品,wordpress、discuz开源产品都是php开发
  • Perl语言擅长支持强大的正则表达式,以及运维工具的开发
  • Python语言,明星语言,不仅适用于脚本程序开发,也擅长web页面开发,如(系统后台、资产管理平台),爬虫程序开发,大量linux以为内工具也有python开发,甚至于游戏开发也使用

shell的优势

虽然有诸多脚本编程语言,但是对于linux操作系统内部应用而言,shell是最好的工具,linux底层命令都支持shell语句,以及结合三剑客(gerp、sed、awk)进行高级用法

  • 擅长系统管理脚本开发,如软件启停脚本、监控报警脚本、日志分析脚本

每个语言都有自己擅长的地方,扬长避短,达到高效运维的目的是最合适的。

# linux默认shell
[root@xuexi3 ~]# echo $SHELL
/bin/bash

bash的基础特性

  • bash是一个命令处理器,运行在文本窗口中,并能执行用户直接输入的命令
  • bash还能从文件中读取linux命令,称之为脚本
  • bash支持通配符、管道、命令替换、条件判断、等逻辑控制语句

bash有诸多方便的功能,有助于提升工作效率

命令历史

shell会保留其中会话中用户提交的命令

histroy #命令、查看历史命令记录,注意【包含文件中和内存中的历史记录】

[root@xuexi3 ~]# echo $HISTSIZE #shell进程可保留的命令历史的条数
1000

[root@xuexi3 ~]# echo $HISTFILE  #存放历史命令的文件,用户退出登录后,持久化命令个数
/root/.bash_history


[root@xuexi3 ~]# ls -a ~/.bash_history  #存放历史命令的文件
/root/.bash_history
  • 命令别名
alias
  • history命令
history #命令 以及参数
-c:清空内存中命令历史
-r:从文件中回复历史命令
数字 :显示最近n条命令 history 10
  • 调用历史命令
!n #执行历史记录中的某n条命令
!! #执行上一次的命令
!string #执行名字以string开头的最近一次命令
  • 快捷键
ctrl+a 移动到行首
ctrl+e 移动到行尾
ctrl+u 删除光标之前的字符
ctrl+k 删除双标之后的字符
crel+l 清空屏幕终端内容,同与clear
  • 命令补全
tab键
补全
  $PATH中存在的命令
  
文件路径补全
  • 调用上一次命令和最后一个参数
ESC加.  #快捷键 调用上一次命令
!$
  • 控制历史命令和环境变量
变量名:HISTCONTROL
ignoredups:忽略重复的命令;
ignorespace:忽略以空白字符开头的命令;
ignoreboth;以上两者同时生效;
posted @ 2022-09-13 10:24  一直前进  阅读(41)  评论(0编辑  收藏  举报