Linux之Shell概述

news2025/2/23 23:24:30

目录

Linux之Shell概述

学习shell的原因

shell是什么

shell起源

查看当前系统支持的shell

查看当前系统默认shell

Shell 概念

Shell 程序设计语言

Shell 也是一种脚本语言

用途

Shell脚本的基本元素

基本元素构成:

Shell脚本中的注释和风格

Shell脚本编写规范

脚本开头

        脚本自动增加注释版权信息

        案例 --- 创建一个屏保脚本

脚本中尽量不用中文注释

多使用内部命令

没有必要使用cat命令

仔细阅读出错信息

文件名以sh结尾

代码缩进:

shell脚本执行

方法1

方法2 

方法3

方法4

bash shell基本功能

echo打印命令

格式

参数

可以输出带颜色的字体

printf命令

格式


Linux之Shell概述

学习shell的原因

        简单易学

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

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

shell是什么

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)以及GNU Bourne-Again shell(bash)

查看当前系统支持的shell

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

查看当前系统默认shell

[root@localhost ~]# echo $SHELL

Shell 概念

        Shell(外壳)--- 是一种命令解释器程序,他能识别用户输入的各种命令,并传递给操作系统

结构图:

        真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁,由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核

        用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell,Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。

        Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 QQ、迅雷、Firefox 等其它软件没有什么区别。然而 Shell 也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux

Shell 程序设计语言

Shell 也是一种脚本语言

        任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行

        有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)

        有的编程语言,如 Shell、JavaScript、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器

        编译型语言的优点 --- 执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等

        脚本语言的优点 --- 使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作

        Shell 就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可

用途

        shell脚本的优势在于处理操作系统底层的业务 (linux系统内部的应用都是shell脚本完成)因为有大量的linux系统命令为它做支撑。2000多个命令都是shell脚本编程的有力支撑,特别是grep、awk、sed等。例如:一键软件安装、优化、监控报警脚本,常规的业务应用,shell开发更简单快速,符合运维的简单、易用、高效原则

        PHP、Python优势在于开发运维工具以及web界面的管理工具,web业务的开发等。处理一键软件安装、优化,报警脚本。常规业务的应用等php/python也是能够做到的。但是开发效率和复杂比用shell就差很多了

熟练掌握shell编程基础知识

        熟练使用vi(vim)编辑器

        熟练掌握Linux基本命令

        熟练掌握文本三剑客工具(grep、sed、awk)

        熟悉常用服务器部署、优化、日志及排错

建议

        掌握Shell脚本基本语法

        形成自己的脚本开发风格

        从简单做起,简单判断,简单循环

        多模仿,多参考资料练习,多思考

        学会分析问题,逐渐形成编程思维

        编程变量名字要规范,采用驼峰语法表示

        不要拿来主义,特别是新手

Shell脚本的基本元素

基本元素构成:

        第1行的“#!/bin/bash”

        注释 --- 说明某些代码功能

        可执行语句 --- 实现程序的功能

Shell脚本中的注释和风格

        作用 --- 通过在代码中增加注释可以提高程序的可读性

        传统的Shell只支持单行注释,其表示方法是一个井号“#”,从该符号开始一直到行尾都属于注释的内容

#comment1
#comment2
#comment3
...

         多行注释 --- 使用冒号“:”配合here document, 语法如下:

:<<'xxxx'
comment1
comment2
comment3
……
xxxx

        xxxx 可以是字符或数字,单引号可以不加,但以防出现莫名其妙的意外发生,比如发生字符扩展,命令替换

Shell脚本编写规范

脚本开头

        开头制定脚本解释器 --- #!/bin/sh 或 #!/bin/bash

        其他行#表示注释

         程序开头需要加版本版权等信息,如:

# Date:创建日期
# Author:作者
# Mail:联系方式
# Function:功能
# Version:版本

        脚本自动增加注释版权信息

[root@localhost ~]# 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, "# Author: Andy_Sun")
        call setline(6, "# Email: Andy_Sun@163.com")
        call setline(7, "# Organization: http://www.cnblogs.com/Andy_Sun/")
        call setline(8, "# Created Time : ".strftime("%F %T"))
        call setline(9, "# Description:")
        call setline(10,"##############################################################")
        call setline(11, "")
    endif
endfunc

 

        案例 --- 创建一个屏保脚本

[root@localhost ~]# vim cmatrix.sh
wget http://archive.ubuntu.com/ubuntu/pool/universe/c/cmatrix/cmatrix_1.2a.orig.tar.gz


tar xvf cmatrix_1.2a.orig.tar.gz

cd cmatrix-1.2a

yum install -y  ncurses-devel

yum install -y  gcc

./configure && make && make install

echo "Program installation complete !"
echo "Program installation complete !"
echo "Program installation complete !"

[root@localhost ~]# bash cmatrix.sh 

[root@localhost ~]# cmatrix 

脚本中尽量不用中文注释

        别吝啬添加注释,必要的注释方便自己别人理解脚本逻辑和功能

        尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰

        单行注释,可以放在代码行的尾部代码行的上部

        多行注释,用于注解复杂的功能说明,可以放在程序体中,也可以放在代码块的开始部分代码修改时,对修改的内容

多使用内部命令

        无论碰到哪种情况,请尽量考虑使用内部命令而不是外部命令

        内部命令执行的效率高,性能好

没有必要使用cat命令

        这是我们经常在论坛里讨论的话题之一。没有必要使用cat命令指的是在有些时候,我们会发现根本没有必要使用cat命令。使用了多余的cat命令会让你的代码看起来很丑陋,而且还会带来性能上的问题

        例如 --- 以下两条命令的结果一样

[root@localhost ~]# cat /etc/passwd | grep root

[root@localhost ~]# grep root /etc/passwd

仔细阅读出错信息

        程序员常犯的一个错误是 --- 当我们敲入的命令报错后,我们中的大多数人只是对错误信息一瞥而过,而不会去认真的读一读,很多时候,错误信息里就包含了解决办法

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

文件名以sh结尾

        shell脚本文件名应见名知义 ,扩展名位sh,如:backup_mysql.sh

代码缩进:

        shell没有强制要求,但建议缩进,这样可以提高阅读性,程序更有层次感

[root@localhost ~]# vim 99.sh
#!/bin/bash
for((i=1;i<10;i++))
do
        echo  -ne  "$i\t"
done

echo

for((i=1;i<70;i++))
do
        echo  -n  "="
done

echo

for((i=1;i<10;i++))
do
        for((j=1;j<=i;j++))
        do
                echo  -en  "$i*$j=$[i*j]\t"
        done
        echo
done
[root@localhost ~]# bash 99.sh 

shell脚本执行

方法1

        使用sh或bash命令执行脚本,不需要执行权限(建议使用),脚本中可以不指定解释器

[root@localhost ~]# vim test.sh 
#!/bin/bash
echo  "china"
[root@localhost ~]# bash test.sh 
[root@localhost ~]# sh test.sh 

        可以使用bash -n 脚本名 ,进行语法检测,且不执行脚本

        可以使用bash -x 脚本名 ,进行脚本执行跟踪,逐条语句的跟踪执行

方法2 

        切换到脚本所在目录使用./执行脚本,需要执行权限

[root@localhost ~]# ./test.sh
-bash: ./test.sh: Permission denied #权限不够

[root@localhost ~]# chmod +x test.sh 
[root@localhost ~]# ./test.sh 

方法3

        绝对路径执行脚本,需要执行权限

[root@localhost ~]# vim /t1.sh
#!/bin/bash
echo  "china"

[root@localhost ~]# /t1.sh
-bash: /t1.sh: Permission denied    #权限不够

[root@localhost ~]# chmod +x /t1.sh
[root@localhost ~]# /t1.sh 

方法4

         使用(.)或者source 执行脚本,不需要执行权限

[root@localhost ~]# source /t1.sh 

[root@localhost ~]# . test.sh 

注意:

        方法1、2、3都是启动一个子shell,在子shell中执行此脚本,脚本中设置的变量在脚本执行完毕后不会保存

        法4 则都是在当前shell进程中执行此脚本,而不是重新启动一个shell 在子shell进程中执行此脚本,并且脚本中设置的变量在脚本执行完毕后会保存下来

bash shell基本功能

echo打印命令

格式

        echo -参数 内容

参数

        

参数作用
-n

取消输出后行末的换行符

-e启用转义字符

可以输出带颜色的字体

        格式 --- echo -e "\e[字体控制;字体颜色或背景色 字符串内容\e[0m"

\e[表示控制开始\e[0m表示控制结束

字体控制选项 --- 1表示高亮4表示下划线5颜色闪烁

颜色如下:字颜色30-37背景色40-47

[root@localhost ~]# vim color.sh
#!/bin/bash
echo -e "\e[30m 黑色字 \e[0m]"
echo -e "\e[1;31m 红色字 \e[0m"
echo -e "\e[32m 綠色字\e[0m"
echo -e "\e[33m 黃色字\e[0m"
echo -e "\e[34m 藍色字\e[0m"
echo -e "\e[35m 紫色字\e[0m"
echo -e "\e[36m 天藍字\e[0m"
echo -e "\e[37m 白色字\e[0m"
echo -e "\e[40;37m 黑底白字\e[0m"
echo -e "\e[41;37m 紅底白字\e[0m"
echo -e "\e[42;37m 綠底白字\e[0m"
echo -e "\e[43;37m 黃底白字\e[0m"
echo -e "\e[44;37m 藍底白字\e[0m"
echo -e "\e[45;37m 紫底白字\e[0m"
echo -e "\e[46;37m 天藍底白字\e[0m"
echo -e "\e[47;30m 白底黑字\e[0m"

[root@localhost ~]# bash color.sh 

printf命令

        printf 命令模仿 C 程序库(library)里的 printf() 程序, 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好,printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n

格式

        printf   格式控制字符串   参数列表

[root@localhost ~]# echo "Hello, shell"
[root@localhost ~]# printf "Hello, shell\n"

[root@localhost ~]# printf "Hello, shell"

[root@localhost ~]# printf "%d %s \n" 1 "abc"

[root@localhost ~]# printf '%d %s \n' 1 "abc" # 单引号双引号效果一样

[root@localhost ~]# printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg

%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
 %-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来

[root@localhost ~]# printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
[root@localhost ~]# printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234

%-4.2f 指格式化为小数,其中 .2 指保留2位小数

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

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

相关文章

ECS通过DNAT将C非专线网段并网

1.问题描述 客户需求&#xff1a;ECS1需要访问140.131.208.0/24 &#xff0c;由于140.131.208.0/24网段属于公网地址&#xff0c;在CSW侧为进行并网。 解决方案&#xff1a;故将ECS1发起的请求其在云内ECS2做DNAT&#xff0c;将该网段转换成CSW并网网段170.101.253.0/24&…

【好文推荐】openGauss psycopg2 批量操作性能测试

测试版本 本测试基于 openGauss 版本的 psycopg2 驱动。 import psycopg2 as pg>>> pg.__libpq_version__90204>>> pg.__version__2.8.6 (dt dec pq3 ext) 测试环境 组件 说明 客户端 Rocky Linux 8 虚拟机 数据库 openGauss 3.0.3 in docker 网络…

《DevOps实践指南》- 读书笔记(三)

DevOps实践指南 Part 3 第一步 &#xff1a;流动的技术实践9. 为部署流水线奠定基础9.1 按需搭建开发环境、测试环境和生产环境9.2 应用统一的代码仓库9.3 使基础设施的重建更容易9.4 运行在类生产环境里才算“完成”9.5 小结 10. 实现快速可靠的自动化测试10.1 对代码和环境做…

C#__资源访问冲突和死锁问题

/// 线程的资源访问冲突&#xff1a;多个线程同时申请一个资源&#xff0c;造成读写错乱。 /// 解决方案&#xff1a;上锁&#xff0c;lock{执行的程序段}:同一时刻&#xff0c;只允许一个线程访问该程序段。 /// 死锁问题&#xff1a; /// 程序中的锁过多&#xf…

【数据结构】二叉树的顺序结构-堆

【数据结构】二叉树的顺序结构-堆 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统虚拟进程地址空间…

Direct LiDAR-Inertial Odometry

DLIO Runing 运行效果&#xff1a; <video id“video” controls""src“data/dlio_ss.mp4” height“500” preload“none”> 论文 摘要 难点&#xff1a;快速运动 or 穿越不规则地形时降低精度&#xff0c;通常过于简单的方法而过高的计算量。本方案提出…

go-zero直连与etcd服务注册中心

go-zero中直连方式 在使用grpc是最重要的就是pb文件了&#xff0c;生成的pb文件&#xff0c;通过pb文件可以生成grpc的客户端和服务端&#xff0c;那么客户端和服务端就可以直连了&#xff0c;再次基础上可以引入etcd实现服务注册。 所有的代码都需要开发者编写&#xff0c;包…

如何面对未来的迷茫和热爱?

很多人并没有明确的热爱的事&#xff0c;就是按照一般规划安安稳稳地上学工作&#xff0c;并在一个不那么爱也不怎么讨厌的工作岗位上度过大部分人生。 首先&#xff0c;我必须说&#xff0c;我并不认为这有什么不妥。或许大部分人并不热爱自己的工作&#xff0c;但他们对自己的…

全球市场争夺战:如何提升品牌在海外市场的竞争力?

随着全球化的不断发展&#xff0c;越来越多的企业将目光投向了海外市场&#xff0c;希望能够在国际舞台上获得更大的发展机会。然而&#xff0c;海外市场的竞争激烈&#xff0c;如何有效地提升品牌在海外市场的竞争力成为了一个关键的问题。本文Nox聚星将和大家从多个方面探讨&…

CAR-NK治疗的商业化之旅

自然杀伤细胞NK细胞是一种重要的免疫效应细胞&#xff0c;能识别并杀伤病毒感染细胞和肿瘤细胞&#xff0c;不过NK细胞本身难以准确识别肿瘤细胞。科学家通过基因工程修饰&#xff0c;在NK细胞表面表达能够和肿瘤特定抗原结合的嵌合抗原受体CAR。跨膜结构域将CAR结构锚定在NK细…

DNS、ICMP协议和NAT技术

文章目录 1. DNS1.1 域名简介 2. NAT技术2.1 NAPT2.2 NAT技术的缺陷2.3 NAT和代理服务器 3. ICMP协议3.1 ping命令 4. 总结 1. DNS TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序&#xff0c;但是IP地址不方便记忆&#xff0c;于是人们发明了一种叫主机名的东西…

视频监控汇聚平台EasyNVR安防视频平台新版本无法对接到EasyNVS平台并报错login error,该如何解决?

安防监控系统EasyNVR视频云存储平台可实现设备接入、实时直播、录像、检索与回放、视频云存储、视频分发等视频能力服务&#xff0c;可覆盖全终端平台&#xff08;pc、手机、平板等终端&#xff09;&#xff0c;在智慧工厂、智慧工地、智慧社区、智慧校园等场景中有大量落地应用…

leetcode 671. 二叉树中第二小的节点(java)

二叉树中第二小的节点 题目描述DFS 深度优先遍历代码演示 题目描述 难度 - 简单 leetcode 671. 二叉树中第二小的节点 给定一个非空特殊的二叉树&#xff0c;每个节点都是正数&#xff0c;并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话&#xff0c;那么…

SpringMVC增删改查(CRUD)的实现

目录 前言 一、前期准备 1.pom.xml---依赖与插件的导入 2.jdbc.properties---数据库连接 3.log4j2.xml---日志文件 4.spring-mybatis 5.spring-context 6.spring-mvc 二、增删改查的实现 1.model与mapper层的生成 2.biz层 3.工具类 4.controller层 三、测试结果 总…

MySQL——select语句的简单介绍和查询时常用的参数

select语句详解 基本的select语句 select 要查询的列名 from 要查询的表 where 限制条件; 如果要查询表的所有内容&#xff0c;则把要查询的列名用—个星号*号表示(之间的案例中都已经使用过)&#xff0c;代表要查询表中所有的列。 而大多数情况&#xff0c;我们只需要查看…

Linux——(第七章)文件权限管理

目录 一、基本介绍 二、文件/目录的所有者 1.查看文件的所有者 2.修改文件所有者 三、文件/目录的所在组 1.修改文件/目录所在组 2.修改用户所在组 四、权限的基本介绍 五、rwx权限详解 1.rwx作用到文件 2.rwx作用到目录 六、修改权限 一、基本介绍 在Linux中&…

[docker]笔记-portainer的使用

1、安装完成后输入ip加端口号打开网页&#xff0c;并再相应位置输入初始密码&#xff0c;初始密码自行设置。 2、进入主页后可以看到如下图标&#xff1a; 3、选择docker环境&#xff0c;即可展示目前docker信息 可以看到目前有1个容器&#xff0c;3个卷和4个镜像&#xff0c…

【C++ • STL】一文带你走进string

文章目录 一、STL简介二、标准库中的string类三、string类的常用接口说明2.1 string类对象的常见构造2.2 string类对象的访问及遍历操作2.2.1 元素访问2.2.2 迭代器 2.3 string类对象的容量操作2.4 string类对象的修改操作2.5 string类非成员函数 四、总结 ヾ(๑╹◡╹)&#x…

西门子PLC如何与多个三菱PLC建立无线通信?

对一个大型工厂&#xff0c;由于生产线的不断改造、新老流程的不断更新&#xff0c;这些PLC系统往往是由不同的制造商提供的。那么在智慧工厂的实现中&#xff0c;常会遇到不同品牌PLC之间需要进行相互通讯的情况。由于场地和生产能效的原因&#xff0c;在后期的系统改造中&…

docker从零部署jenkins保姆级教程(上)

jenkins&#xff0c;基本是最常用的持续集成工具。在实际的工作中&#xff0c;后端研发一般没有jenkins的操作权限&#xff0c;只有一些查看权限&#xff0c;但是我们的代码是经过这个工具构建出来部署到服务器的&#xff0c;所以我觉着有必要了解一下这个工具的搭建过程以及简…