SHELL基本知识超级详解

news2024/11/16 6:44:22

目录

shell基本知识

1,为什么学习和使用Shell编程

2, shell的起源

3,shell的功能

4,shell的分类

5, shell脚本的基本元素

6, shell脚本编写规范

7,shell脚本的执行方式

8, 执行脚本的方法

9,shell脚本的退出状态


shell基本知识

shell: 壳子

1,为什么学习和使用Shell编程

对于一个合格的系统管理员来说,学习和掌握Shell编程是非常重要的。通过编程,可以在很大程度 上简化日常的维护工作,使得管理员从简单的重复劳动中解脱出来。

shell程序的特点:

  1、简单易学

  2、解释性语言,不需要编译即可执行

2, shell的起源

(1)1964年,美国AT&T公司的贝尔实验室、麻省理工学院及美国通用电气公司共同参与开始

         研发一套 可以安装在大型主机上的多用户、多任务的操作系统,该操作系统的名称Multics。

(2)1970年,丹尼斯•里奇和汤普逊启动了另外一个新的多用户、多任务的操作系统的项目,

          他们把这 个项目称之为UNICS。

(3)1973年,使用C语言重新编写了Unix。通过这次编写,使得Unix得以移植到其他的小型机

          上面。

(4)1979年,第一个重要的标准UNIX Shell在Unix的第7版中推出,并以作者史蒂夫•伯

          恩(Stephen Bourne)的名字命名,叫做Bourne Shell,简称为sh

(5) 20世纪70年代末,C Shell作为2BSD UNIX的一部分发布,简称csh。

(6)之后又出现了许多其他的Shell程序,主要包括Tenex C Shell(tcsh)、Korn Shell(ksh)

          以及 GNU Bourne-Again shell(bash)。

3,shell的功能

 Shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统。它的作用类似于 Windows操作系统中的命令行,但是,Shell的功能远比命令行强大的多。在UNIX或者localhost中, Shell既是用户交互的界面,也是控制系统的脚本语言。

4,shell的分类

(1)Bourne Shell:标识为sh,该Shell由Steve Bourne在贝尔实验室时编写。在许多Unix系

         统中,该 Shell是root用户的默认的Shell。

(2) Bourne-Again Shell:标识为bash,该Shell由Brian Fox在1987年编写,是绝大多

          数localhost发行 版的默认的Shell。

(3) Korn Shell:标识为ksh,该Shell由贝尔实验室的David Korn在二十世纪八十年代早期

           编写。它完 全向上兼容 Bourne Shell 并包含了C Shell 的很多特性。

(4)C Shell:标识为csh,该Shell由Bill Joy在BSD系统上开发。由于其语法类似于C语言,因

         此称为C Shell

如何查看当前系统支持的shell

[root@localhost ~]# cat /etc/shells

如何查看当前系统默认shell?

[root@localhost ~]# echo $SHELL

什么是驼峰语法?

 骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,第 一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母,例如: myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。

getsomething -> getSomething

getsomething -> get_something

5, shell脚本的基本元素

对于一个基本的Shell程序来说,应该拥有以下基本元素:

 1.声明:声明用哪个命令解释器来解释并执行当前脚本文件中的语句,一般写的解释器为 #!/bin/bash 。

 2.命令:可执行语句,实现程序的功能。

 3.注释:说明某些代码的功能,通过在代码中增加注释可以提高程序的可读性。

(1)单行注释:#开头的一整行都是注释,

       例如:    #comment1

                      #comment2

                      #comment3 ……

(2)多行注释,使用冒号“:”配合here document可实现多行注释,

       例如:

                :<<BLOCK(可以是任意的字符)

                 ……注释内容

                 BLOCK

 4.赋予rx的权限

#!/bin/bash 或者 #!/bin/sh

写命令或者shell中语句(变量定义,if-else, for, while)

注释:单行注释和多行注释

单行:#

多行数值: -》 :<<BLOCK(可以是任意的字符) 注释的开始

                        BLOCK 注释的结束

小练习:

编写脚本并执行

(1)创建目录shell_code23

[root@wangjingjing ~]# mkdir shell_code23

[root@wangjingjing ~]# cd shell_code23

(2)创建目录0130

[root@wangjingjing shell_code23]# mkdir 0130

[root@wangjingjing shell_code23]# cd 0130/

(3)创建文件first_script.sh

[root@wangjingjing 0130]# vim first_scripts.sh

(4)编辑文件,并保存退出

#!/bin/bash

#祝大家新年好

echo "Happy New Year"

:<<annotation

多行注释

annotation

(5)给文件加执行权限

(6)执行文件:

[root@wangjingjing 0130]# bash first_scripts.sh

Happy New Year

6, shell脚本编写规范

(1)脚本文件名应见名知意,例如backup_mysql.sh

(2)文件开头指定脚本解释器 #!/bin/sh 或 #!/bin/bash

(3)开头加版本特权等信息

# Date:创建日期

# Author:作者

# Mail:联系方式

 # Function:功能

# Version:版本

(4)脚本中尽量不要用中文注释 别吝啬添加注释,必要的注释方便自己别人理解脚本逻辑和功能; 尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰; 单行注释,可以放在代码行的尾部或代码行的上部; 多行注释,用于注解复杂的功能说明,可以放在程序体中,也可以放在代码块的开始部分。

(5)多使用内部命令 常用的内部命令有:echo、eval、exec、export、read、shift、exit

echo

echo可在屏幕上输出信息

-n        不换行输出内容

-e         解析转义字符

 \n                换行

 \r            回车

 \t            制表符

 \b           退格

 \v           纵向制表符

eval

 命令格式:eval args

功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。

exec

(1)exec命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程就终止了

  (2)export设置或者显示环境变量

  (3)read命令可从标准输入读取字符串等信息,传给shell程序内部定义的变量。

              -p prompt:设置提示信息

              -t timeout:设置输入等待时间,单位默认为秒 (超时后停止)

shift

shift,在程序中每使用一次shift语句,都会使所有的位置参数依次向左移动一个位置,

并使位置参 数$#减1,直到减到0为止。

[root@wangjingjing ~]# vim arg_script.sh

exit

exit,退出shell程序。在exit之后可以有选择地指定一个数作为返回状态

[root@wangjingjing ~]# vim exit_script.sh

查看退出状态码(此处指定退出状态码)

(6)没有必要使用cat命令

eg:cat /etc/passwd | grep guru

使用以下方式即可

eg:grep guru /etc/passwd

(7)代码缩进 4个字符

缩进用4个字符

针对当个用户vim配置文件应该放在~/.vimrc

针对所有用户的vim配置应该放在/etc/vimrc

打开~/.vimrc文件,配置并保存退出

[root@wangjingjing ~]# vim ~/.vimrc

autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"

 

func SetTitle()

  if expand("%:e") == 'sh'

    call setline(1,"#!/bin/bash")

        call setline(2,"#########################")

        call setline(3,"#File name:".expand("%"))

        call setline(4,"#Version:v1.0")

        call setline(5,"#Email:admin@test.com")

        call setline(6,"#Created time:".strftime("%F %T"))

        call setline(7,"#Description:")

        call setline(8,"#########################")

        call setline(9,"")

  endif

endfunc

autocmd FileType sh setlocal ai ts=4 sw=4 et

新建一个newfile.sh文件

(8)仔细阅读出错信息 有时候我们修改了某个错误并再次运行后,系统依旧会报错。然后我们再次修改,但系统再次报 错。这可能会持续很长时间。但实际上,旧的错误可能已经被纠正,只是由于出现了其它一些新错误才 导致系统再次报错。

7,shell脚本的执行方式

(1)交互式执行   不能永久保存代码

方法一:

[root@wangjingjing 0130]# for i in `seq 6`

> do    开始

> echo $i    打印

> done     结束

1

2

3

4

5

6

方法二:

(2)作为程序文件执行(常用)

 对于一组需要经常重复执行的Shell语句来说,将它们保存在一个文件中来执行。我们通常称这种包 含多个Shell语句的文件为Shell脚本,或者Shell脚本文件。脚本文件是普通的文本文件,可使用任何的 文本编辑器查看或修改Shell脚本。

8, 执行脚本的方法

(1)bash ./filename.sh(产生子进程,再运行,使用当前指定的bash shell去运行)

    需要权限,可以直接执行文件

(2)./filename.sh(产生子进程,再运行,使用脚本里面指定的shell去运行。使用该

        种方式执行需要x 权限

没有加权限时执行文件

[root@wangjingjing 0130]# ./first_scripts.sh

bash: ./first_scripts.sh: Permission denied

添加x权限执行文件

[root@wangjingjing 0130]# chmod +x first_scripts.sh

[root@wangjingjing 0130]# ls -l

[root@wangjingjing 0130]# ./first_scripts.sh

脚本类型为bash

脚本类型为sh

(3)source ./filename.sh(source命令是一个shell内部命令,其功能是读取指定

         的shell程序文件,并 且依次执行其中的所有的语句,并没有创建新的子shell

         进程,所以脚本里面所有创建的变量都会保存到 当前的shell里面,不需要权限

没权限时执行文件

[root@wangjingjing 0130]# chmod -x first_scripts.sh

[root@wangjingjing 0130]# ls -l

total 4

-rw-r--r--. 1 root root 102 Jan 30 19:47 first_scripts.sh

[root@wangjingjing 0130]# source first_scripts.sh

Happy New Year

(4). filename.sh(和source一样,也是使用当前进程执行)

练习:

data=1: 当前的连接上去定义的即-bash这个进程上定义的

如果在shell脚本的执行方式上:

get_data.sh

echo "$data"

bash get_data.sh

./get_data.sh

source get_data.sh

. get_data.sh

答案:

1,2产生新的子进程,拿不到data的值

3,4不产生子进程,可以拿到data的值

9,shell脚本的退出状态

在UNIX或者Linux中,每个命令都会返回一个退出状态码。退出状态码是一个整数,其有效范围为 0~255。通常情况下,成功的命令返回0,而不成功的命令返回非0值。非0值通常都被解释成一个错误 码。行为良好的UNIX命令,程序和工具都会返回0作为退出码来表示成功。

 Shell脚本中的函数和脚本本身也会返回退出状态码。在脚本或者是脚本函数中执行的最后的命令会决定 退出状态码。另外,用户也可以在脚本中使用exit语句将指定的退出状态码传递给Shell。

 退出状态码如何取获取:echo $?

成功  0

终止

失败

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 类的继承

通过原型链的方式继承 通过实例化一个构造函数&#xff0c;使字类的原型指向父类的实例&#xff0c;字类就可以调用到父类的属性和方法 function Parent() {this.parentName 父亲;this.getParentName function () {console.log("parent name is: %s", this.paren…

剑指 Offer 第13天 第14天

目录 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 剑指 Offer 57. 和为s的两个数字 剑指 Offer 58 - I. 翻转单词顺序 剑指 Offer 12. 矩阵中的路径 面试题13. 机器人的运动范围 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 输入一个整数数组&#xff0c;实现一个函…

maven基础-关于什么是maven、如何安装以及在Eclipse中的使用等等

本文是向大家介绍项目管理工具maven的基础使用&#xff0c;它能够实现项目构建打包共享&#xff0c;能够实现自动清理、编译、测试、报告等提高开发效率。一、为什么使用Maven这样的构建工具【why&#xff1f;】二、maven是什么【what&#xff1f;】三、安装maven四、第一个mav…

SpringCloud_02

注意&#xff1a; spring:application:name: userserviceprofiles:active: devcloud:nacos:server-addr: localhost:8848config:file-extension: yaml这里的name如果对应的nacos只有默认的命名空间&#xff0c;就直接写入服务名&#xff0c; 如果有其他的命名空间&#xff0c;…

windows 10使用Pycharm从0到1搭建一个QQ聊天机器人

文章目录选择Python环境安装nb-cli配置Go-cqhttp大工告成&#xff01;选择Python环境 Nonebot2官方说&#xff0c;python版本要大于3.8&#xff0c;推荐大家使用虚拟环境&#xff0c;在Poetry、venv、Conda选择一个自己熟悉的即可。 安装nb-cli pip install -i https://pypi…

2-3-1-1、MySQL相关变种及体系结构

目录与MySQL有关的数据库DrizzleMariaDBPercona ServerPostgre SQLSQLiteMySQL体系结构简介连接池管理工具和服务SQL 接口解析器存储引擎、文件系统连接层Server层&#xff08;SQL处理层&#xff09;缓存缓存弃用的原因存储引擎层MySQL 官方引擎概要InnoDB 存储引擎MylSAM 存储…

Linux常用命令——rexec命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) rexec 运程执行Linux系统下命令 补充说明 rexec命令用于在指定的远程Linux系统主机上执行命令&#xff0c;向远程rexec服务器发出执行命令的请求。 rexec命令通过检查$HOME/.netrc文件&#xff08;包含远程主机…

安装NLTK出现11004和11006错误

出现11404的错误 原因是因为访问github的ip地址出现错误 解决方案&#xff1a; 打开C:->Windows->System32->drivers->etc->host, 打开host文件。 在文件最后添加185.199.108.133 raw.githubusercontent.com&#xff0c;即可解决 可以查看raw.githubusercont…

Sublime Text运行C和C++程序

Sublime Text 是一款当下非常流行的文本编辑器&#xff0c;其功能强大&#xff08;提供有众多的插件&#xff09;、界面简洁、还支持跨平台使用&#xff08;包括 Mac OS X、Linux 和 Windows&#xff09;。 在程序员眼中&#xff0c;Sublime Text 不仅仅是一个文本编辑器&…

文本处理以及求相似度

常规操作。先读取文档 ## 1. 分词 &#xff0c; 清洗关键词&#xff0c; # # 删除 特殊字符 # PATTERN r[?|$|&|*|%||(|)|~] # text re.sub(PATTERN, r, text)# string manipulation libs import re import string import nltk from nltk.corpus impor…

Eureka、Ribbon、Nacos之初识微服务(一)

一.微服务技术栈二.服务架构1.1单体架构1.2分布式架构1.3微服务技术对比1.4服务提供者与消费者&#xff08;相对&#xff09;服务提供者:暴露接口给其它微服务调用服务消费者:调用其它微服务提供的接口提供者与消费者角色其实是相对的三.Eureka注册中心1.1Eureka的作用Eureka自…

美团动态线程池实践思路,开源了

背景 「使用线程池 ThreadPoolExecutor 过程中你是否有以下痛点呢&#xff1f;」 ❝ 1.代码中创建了一个 ThreadPoolExecutor&#xff0c;但是不知道那几个核心参数设置多少比较合适 2.凭经验设置参数值&#xff0c;上线后发现需要调整&#xff0c;改代码重启服务&#xff0c;…

java职工工资管理系统(GUI+无数据库)使用java制作

当年大一的课程设计,欢迎大家参考借鉴! 二、系统实现 1.登录界面 创建容器,把相应得组件设置后放入容器。如:密码、文本框、用户、按钮等组件。 设置组件位置使其更加美观(如下图)。账号:root 密码:123 2.系统界面 在查询窗口输入工号,监听模块识别并在文件内查找与工…

部署 KubeEdge 及简单使用

版本说明 k8s版本&#xff1a;1.22.3 kubeedge&#xff1a;1.10.0 kubernetes 集群准备 [roothadoop03 kubeedge]# kubectl get nodes NAME STATUS ROLES AGE VERSION hadoop03 Ready control-plane,master 9d v1.22.3cloudcore k…

电脑c盘空间不足如何清理空间,c盘清理的方法

关于电脑c盘空间不足&#xff0c;相信是很多人所头疼的问题吧&#xff0c;随着电脑使用次数的增加&#xff0c;那c盘的空间越来越少&#xff0c;一直到完全变红&#xff0c;电脑也变得越来越卡&#xff0c;那么我们要怎么去解决呢&#xff1f;电脑c盘空间不足如何清理空间&…

【Go】基于telegraf进行自定义插件开发(一)

基于telegraf进行插件的自定义&#xff08;一&#xff09;前言正文环境准备目录结构插件结构示例代码注册插件结语前言 以长期使用Prometheus和各种exporter的经验来说&#xff0c;大量的exporter会占用物理机的端口资源&#xff0c;虽说这不是特别严重的问题&#xff0c;但是…

【生物信息学】基于SparCC, MENA, LSA, CoNet构建微生物相互作用网络

基于SparCC, MENA, LSA, CoNet构建微生物相互作用网络背景介绍网络推断技术用于宏基因组学及其存在的问题实现方法和工具SparCCMENALSACoNetSPIEC-EASI总结参考资料背景介绍 微生物之间的共现(Co-occurrence)可能有以下几种原因&#xff0c;它们可能具有一定的生态关系&#x…

视频转换成gif动图如何操作?教你三步完成视频转gif

现在网络上流行的gif动图最常见的就是从用电影、电视剧等短视频中截取出来的画面做成gif动画。大家看到这些gif动图一定觉得使用视频转gif&#xff08;https://www.gif.cn/&#xff09;制作非常的复杂麻烦吧&#xff01;其实&#xff0c;想要利用视频截取gif动画非常的简单。给…

Linux mysql安装

1、软件下载1.1、下载地址&#xff1a;https://www.mysql.com/2、Linux 查看centos版本&#xff08;用于mysql版本选择&#xff09;2.1、先使用 yum 安装 redhat-lsb&#xff1a;yum install -y redhat-lsb2.2、安装完成后&#xff0c;使用 -a 查看&#xff1a;lsb_release -a3…

前端必知:如何判断元素出现在视口内(性能优化涉及)

要检测一个元素是否可见或者两个元素是否相交的需求场景有这些&#xff1a; 图片懒加载——当图片滚动到可见时才进行加载内容无限滚动——也就是用户滚动到接近内容底部时直接加载更多&#xff0c;而无需用户操作翻页&#xff0c;给用户一种网页可以无限滚动的错觉检测广告的…