初识shell

news2024/11/26 2:34:24

文章目录

    • 一、shell基本知识
      • 1.1为什么学习和使用Shell编程
      • 1.2 什么是Shell
        • 1.2.1 shell的起源
        • 1.2.2 shell的功能
      • 1.3 shell的分类
      • 1.4 作为程序设计的语言——shell
      • 1.5 如何学好shell
      • 1.6 shell脚本的基本元素
      • 1.7 shell脚本编写规范
      • 1.8shell脚本的执行方式
      • 1.9 执行脚本的方法
      • 1.10 shell脚本的退出状态

一、shell基本知识

1.1为什么学习和使用Shell编程

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

shell程序的特点:

  • 简单易学
  • 解释性语言,不需要编译即可执行

1.2 什么是Shell

在学习Shell编程之前,必须弄清楚什么是Shell。为了能够使读者在学习具体的Shell编程之前对Shell有个基本的了解,本节将对Shell进行概括性的介绍,包括Shell的起源和功能。

1.2.1 shell的起源

  • 1964年,美国AT&T公司的贝尔实验室、麻省理工学院及美国通用电气公司共同参与开始研发一套可以安装在大型主机上的多用户、多任务的操作系统,该操作系统的名称为Multics。

  • 1970年,丹尼斯•里奇和汤普逊启动了另外一个新的多用户、多任务的操作系统的项目,他们把这个项目称之为UNICS。

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

  • 1979年,第一个重要的标准UNIX Shell在Unix的第7版中推出,并以作者史蒂夫•伯恩(StephenBourne)的名字命名,叫做Bourne
    Shell,简称为sh。

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

  • 之后又出现了许多其他的Shell程序,主要包括Tenex C Shell(tcsh)、Korn Shell(ksh)以及GNUBourne-Again shell(bash)。

1.2.2 shell的功能

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

1.3 shell的分类

  • Bourne Shell:标识为sh,该Shell由SteveBourne在贝尔实验室时编写。在许多Unix系统中,该Shell是root用户的默认的Shell。
  • Bourne-Again Shell:标识为bash,该Shell由Brian
    Fox在1987年编写,是绝大多数localhost发行版的默认的Shell。
  • Korn Shell:标识为ksh,该Shell由贝尔实验室的David Korn在二十世纪八十年代早期编写。它完全向上兼容 BourneShell 并包含了C Shell 的很多特性。
  • C Shell:标识为csh,该Shell由Bill Joy在BSD系统上开发。由于其语法类似于C语言,因此称为CShell。

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

[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin

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

[root@localhost ~]# echo $SHELL
/bin/bash

1.4 作为程序设计的语言——shell

Shell不仅仅是充当用户与UNIX或者localhost交互的角色,还可以作为一种程序设计语言来使用。通过Shell编程,可以实现许多非常实用的功能,提高系统管理的自动化水平。

如果有一系列经常需要使用的命令,把它存储在一个文件里,shell可以读取这个文件并顺序执行其中的命令,我们把这样的文件就叫shell脚本。shell脚本按行解释文件里的命令。

1.5 如何学好shell

学好shell编程基础知识:

  1. 熟练使用vi(vim)编辑器
  2. 熟练掌握Linux基本命令
  3. 熟练掌握文本三剑客工具(grep、sed、awk)
  4. 熟悉常用服务器部署、优化、日志及排错

如何学好shell编程:

  1. 掌握Shell脚本基本语法
  2. 形成自己的脚本开发风格
  3. 从简单做起,简单判断,简单循环
  4. 多模仿,多参考资料练习,多思考
  5. 学会分析问题,逐渐形成编程思维
  6. 编程变量名字要规范,采用驼峰语法表示

什么是驼峰语法?
骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母,例如:

myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。

除了驼峰命名法,另外还有匈牙利命名法。基本原则是:变量名=属性+类型+对象描述。匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。比如m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量。

还有下划线命名法,比如file_name。

1.6 shell脚本的基本元素

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

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

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

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

      #comment1
      #comment2
      #comment3
      ……
      
      
    • (2)多行注释,使用冒号 “:” 配合here document可实现多行注释,例如:

      :<<BLOCK
      ……注释内容
      BLOCK
      
  3. 赋予rx的权限

1.7 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可在屏幕上输出信息
    在这里插入图片描述
    示例:

    [root@localhost ~]# echo -n i have a cat
    i have a cat[root@localhost ~]#
    [root@localhost ~]# echo i\thave\ta\tcat
    ithavetatcat
    [root@localhost ~]# echo -e i\thave\ta\tcat
    ithavetatcat
    [root@localhost ~]# echo -e "i\thave\ta\tcat"
    i have a cat
    
  • eval

    • 命令格式:eval args
      功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。
      [root@localhost test]# a='shuju;head -1 /etc/passwd'
      [root@localhost test]# echo $a
      shuju;head -1 /etc/passwd
      [root@localhost test]# eval echo $a
      shuju
      root:x:0:0:root:/root:/bin/bash
      
  • exec命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程就终止了。

  • export设置或者显示环境变量

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

	-p prompt:设置提示信息
	-t timeout:设置输入等待时间,单位默认为秒
[root@localhost test]# read -t 10 -p "please input your name:" name
please input your name:xiaoming
[root@localhost test]# echo $name
xiaoming
[root@localhost test]# echo -n "please input your name:";read name1 name2
#读取两个输入(以空格隔开),分别赋值给name1和name2
please input your name:xiaoming xiaohong
[root@localhost test]# echo $name1
xiaoming
[root@localhost test]# echo $name2
xiaohong
  • shift,在程序中每使用一次shift语句,都会使所有的位置参数依次向左移动一个位置,并使位置参数$#减1,直到减到0为止。
  • exit,退出shell程序。在exit之后可以有选择地指定一个数作为返回状态

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

eg:cat /etc/passwd | grep guru
使用以下方式即可
eg:grep guru /etc/passwd

(7)代码缩进
示例:

#!/bin/bash
i=1
while [ $i -le 10 ]
do
	if [ $i -le 9 ]
	then
		username=user0$i
	else
		username=user$i
	fi
	! id $username &>/dev/null && {
		useradd $username
		echo $username | passwd --stdin $username &>/dev/null
	}
	let i++
done

(8)仔细阅读出错信息

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

如何快速生成脚本开头的版本版权注释信息

[root@localhost ~]# vim ~/.vimrc //进入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

1.8shell脚本的执行方式

(1)交互式执行 //人工输入一句,机器执行一句

[root@localhost ~]# for filename in `ls /etc`
> do
> if echo "$filename" | grep "passwd"
> then
> echo "$filename"
> fi
> done

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

[root@localhost ~]# mkdir /test
[root@localhost ~]# cd /test
[root@localhost test]# vim test1.sh
#!/bin/bash
for filename in `ls /etc`
do
if echo "$filename" | grep "passwd"
then
echo "$filename"
fi
done

1.9 执行脚本的方法

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

(2)./filename.sh(产生子进程,再运行,使用脚本里面指定的shell去运行。使用该种方式执行需要x权限)

(3)source ./filename.sh(source命令是一个shell内部命令,其功能是读取指定的shell程序文件,并且依次执行其中的所有的语句,并没有创建新的子shell进程,所以脚本里面所有创建的变量都会保存到当前的shell里面)

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

[root@localhost test]# vim test2.sh
#!/bin/bash
cd /tmp
pwd
[root@localhost test]# ls -l test2.sh
-rw-r--r--. 1 root root 24 Apr 30 20:09 test2.sh
(1)[root@localhost test]# bash test2.sh
/tmp
(2)[root@localhost test]# ./test2.sh
-bash: ./test2.sh: Permission denied
[root@localhost test]# chmod a+rx test2.sh
[root@localhost test]# ./test2.sh
/tmp
(3)[root@localhost test]# source test2.sh
/tmp
[root@localhost tmp]#
(4)[root@localhost test]# . test2.sh
/tmp
[root@localhost tmp]#

执行shell脚本时,如果使用1和2这种方式执行会在当前的进程下产生一个新的bash子进程,所以子进程切换到了/tmp目录,当脚本结束,子进程也就结束了,所以当前进程的目录不会发生变化;3和4方式执行时,不会产生新的进程,所以脚本执行结束后当前的目录会变成/tmp。
示例二:

[root@localhost test]# echo 'userdir=`pwd`' > test3.sh
[root@localhost test]# cat test3.sh
userdir=`pwd`
(1)[root@localhost test]# bash test3.sh
[root@localhost test]# echo $userdir
[root@localhost test]#
(2)[root@localhost test]# chmod a+rx test3.sh
[root@localhost test]# ./test3.sh
[root@localhost test]# echo $userdir
[root@localhost test]#
(3)[root@localhost test]# source test3.sh
[root@localhost test]# echo $userdir
/test
(4)[root@localhost test]# . test3.sh
[root@localhost test]# echo $userdir
/test

1.10 shell脚本的退出状态

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

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

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

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

相关文章

PPOJ刷题-3

PPOJ刷题-3 1265: 最近公共祖先 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&…

Elasticsearch7.8.0版本进阶——分布式集群(单节点集群)

目录一、Elasticsearch集群的安装1.1、Elasticsearch集群的安装&#xff08;win10环境&#xff09;1.2、Elasticsearch集群的安装&#xff08;linux环境&#xff09;二、单节点集群&#xff08;win10环境集群演示&#xff09;2.1、单节点集群的概述2.2、单节点集群的示例一、El…

On Joint Learning for Solving Placement and Routing in Chip Design

On Joint Learning for Solving Placement and Routing in Chip Design 目录On Joint Learning for Solving Placement and Routing in Chip Design一、整体思路和创新点二、相关工作2.1 partitioning-based methods&#xff08;基于分区的方法&#xff09;2.2 stochastic/hill…

Part 4 描述性统计分析(占比 10%)——中

文章目录【后续会持续更新CDA Level I&II备考相关内容&#xff0c;敬请期待】【考试大纲】【考试内容】【备考资料】【扩展知识——大数定律和中心极限定理】3、统计分布3.1、离散型随机变量的三种重要分布3.1.1、两点分布3.1.2、伯努利试验及二项分布3.1.2.1、伯努利试验3…

算法训练营 day39 贪心算法 无重叠区间 划分字母区间 合并区间

算法训练营 day39 贪心算法 无重叠区间 划分字母区间 合并区间 无重叠区间 435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互…

Early Stopping中基于测试集(而非验证集)上的表现选取模型的讨论

论文中一般都是用在验证集上效果最好的模型去预测测试集&#xff0c;多次预测的结果取平均计算准确率或者mAP值&#xff0c;而不是单纯的取一次验证集最好的结果作为论文的结果。如果你在写论文的过程中&#xff0c;把测试集当做验证集去验证的话&#xff0c;这其实是作假的&am…

shiro、springboot、vue、elementUI CDN模式前后端分离的权限管理demo 附源码

shiro、springboot、vue、elementUI CDN模式前后端分离的权限管理demo 附源码 源码下载地址 https://github.com/Aizhuxueliang/springboot_shiro.git 前提你电脑的安装好这些工具&#xff1a;jdk8、idea、maven、git、mysql&#xff1b; shiro的主要概念 Shiro是一个强大…

麻省理工出版 | 2023年最新深度学习综述手册

UCL Simon Prince的新书&#xff1a;《Understanding Deep Learning》 &#xff0c;在2023年2月6日由MIT Press出版。他之前写过很受欢迎的《Computer Vision: Models, Learning, and Inference》。 关于这本最新的深度学习手册&#xff0c;作者这样介绍它&#xff1a; 正如书…

数据结构与算法基础-学习-09-线性表之栈的理解、初始化顺序栈、判断顺序栈空、获取顺序栈长度的实现

一、个人理解栈是线性表的一种衍生&#xff0c;和之前的顺序表和链表在插入和删除元素上有较大差异&#xff0c;其他基本相同&#xff0c;栈是数据只能插入表的尾部&#xff08;栈顶&#xff09;&#xff0c;删除数据时只能删除表的尾部&#xff08;栈顶&#xff09;数据&#…

2022Q4手机银行新版本聚焦提升客群专属、财富开放平台、智能化能力,活跃用户规模6.91亿人

易观&#xff1a;2022年第4季度&#xff0c;手机银行APP迭代升级加快&#xff0c;手机银行作为零售银行服务及经营的主阵地&#xff0c;与零售银行业务发展的联系日益紧密。迭代升级一方面可以顺应零售银行发展战略及方向&#xff0c;对手机银行业务布局进行针对性调整优化&…

前端面经详解

目录 css 盒子充满屏幕 A.给div设置定位 B.设置html,body的宽高 C.相对当前屏幕高度&#xff08;强烈推荐&#xff09; 三列布局&#xff1a;左右固定&#xff0c;中间自适应 flex布局&#xff08;强烈推荐&#xff09; grid布局 magin负值法 自身浮动 绝对定位 圣…

基于PHP的招聘网站

摘要在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括在线招聘的网络应用&#xff0c;在外国在线招聘已经是很普遍的方式&#xff0c;不过国内的在线招聘可能还处于起步阶段。招聘网站具有招聘信息功能的双向选择&#xff0c;…

UMI入门(创建react项目)

1、umI的环境要求确保 node 版本是 10.13 或以上React 16.8.0 及以上的 React2、什么时候不用 umi需要支持 IE 8 或更低版本的浏览器需要支持 React 16.8.0 以下的 React需要跑在 Node 10 以下的环境中有很强的 webpack 自定义需求和主观意愿需要选择不同的路由方案3、与其他框…

领域搜索算法之经典The Lin-Kernighan algorithm

领域搜索算法之经典The Lin-Kernighan algorithmThe Lin-Kernighan algorithm关于算法性能提升的约束参考文献领域搜索算法是TSP问题中的三大经典搜索算法之一&#xff0c;另外两种分别是回路构造算法和组合算法。 而这篇文章要介绍的The Lin-Kernighan algorithm属于领域搜索算…

精华文稿|迈向统一的点云三维物体检测框架

分享嘉宾 | 杨泽同 文稿整理 | William 嘉宾介绍 Introduction 3D检测是在三维世界中去定位和分类不同的物体&#xff0c;与传统2D检测的区别在于它有一个深度信息。目前&#xff0c;大部分的工作是倾向于用点云去做三维检测&#xff0c;点云实际上是通过传感器去扫描出来的一…

Redis 的安装 + SpringBoot 集成 Redis

1.安装 Redis此处的 Redis 安装是针对 Linux 版本的安装, 因为 Redis 官方没有提供 Windows 版本, 只提供了 Linux 版本. 但是我们可以通过Windows 去远程连接 Redis.1.1 使用 yum 安装 Redis使用如下命令, 将 Redis 安装到 Linux 服务器:yum -y install redis1.2 启动 Redis使…

科技云报道:开源真的香,风险知多少?

科技云报道原创。 过去几年&#xff0c;开源界一片火热&#xff0c;开源软件技术已全面进军操作系统、云原生、人工智能、大数据、半导体、物联网等行业领域。 数据显示&#xff0c;我国超九成企业在使用或正计划使用开源技术。 与此同时&#xff0c;全球各大开源组织相继兴…

苹果手机专用蓝牙耳机有哪些?与iphone兼容性好的蓝牙耳机

蓝牙耳机摆脱了线缆的束缚&#xff0c;在地以各种方式轻松通话。自从蓝牙耳机问世以来&#xff0c;一直是行动商务族提升效率的好工具&#xff0c;苹果产品一直都是受欢迎的数码产品&#xff0c;下面推荐几款与iphone兼容性好的蓝牙耳机。 第一款&#xff1a;南卡小音舱蓝牙耳…

Springboot部署阿里云短信服务

一、阿里云短信模板配置&#xff08;获取SignName[签名名称]、TemplateCode[模板CODE]&#xff09; 1. 进入阿里云首页直接搜索短信服务&#xff0c;并点击国内消息进入国内文本短信管理页面 2. 选择签名管理点击添加签名 填写签名信息并提交 注&#xff1a;下面的签名来源如…

全栈自动化测试技术笔记(一):前期调研怎么做

昨天下午在家整理书架&#xff0c;把很多看完的书清理打包好&#xff0c;预约了公益捐赠机构上门回收。 整理的过程中无意翻出了几年前的工作记事本&#xff0c;里面记录了很多我刚开始做自动化和性能测试时的笔记。 虽然站在现在的角度来看&#xff0c;那个时候无论是技术细…