Shell编程基础篇-上

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

1.1 前言

1.1.1 为什么学Shell

Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。每一个合格 Linux系统管理员或运维工程师,都需要能够熟练地编写Shell脚本语言,并能够阅 读系统及各类软件附带的Shell脚本内容。只有这样才能提升运维人员的工作效率,适 应曰益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础

1.1.2 什么是shell

Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出屏幕返回给用户。

这种对话方式可以是:

交互的方式:从键盘输入命令,通过/bin/bash的解析,可以立即得到Shell的回应

[root@clsn ~]# ls            
anaconda-ks.cfg  
[root@clsn ~]# echo ls |bash 
anaconda-ks.cfg   

非交互的方式: 脚本

1.1.3 什么是Shell脚本

  命令、变量和流程控制语句等有机的结合起来

         shell脚本擅长处理纯文本类型的数据,而linux中,几乎所有的配置文件,日志,都是纯文本类型文件

1.1.4 脚本语言的种类

一、编译型语言

定义:指用专用的编译器,针对特定的操作平台(操作系统)将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码(具有操作数,指令、及相应的格式),这个过程叫做编译(./configure  make makeinstall );编译好的可执行性文件(.exe),可在相对应的平台上运行(移植性差,但运行效率高)。。

典型的编译型语言有, C语言、C++等。

另外,Java语言是一门很特殊的语言,Java程序需要进行编译步骤,但并不会生成特定平台的二进制机器码,它编译后生成的是一种与平台无关的字节码文件(*.class)(移植性好的原因),这种字节码自然不能被平台直接执行,运行时需要由解释器解释成相应平台的二进制机器码文件;大多数人认为Java是一种编译型语言,但我们说Java即是编译型语言,也是解释型语言也并没有错。

二、解释型语言

定义:指用专门解释器对源程序逐行解释成特定平台的机器码并立即执行的语言;相当于把编译型语言的编译链接过程混到一起同时完成的。

解释型语言执行效率较低,且不能脱离解释器运行,但它的跨平台型比较容易,只需提供特定解释器即可。

常见的解释型语言有, Python(同时是脚本语言)与Ruby等。

三、脚本语言

定义:为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言。

特点:程序代码即是最终的执行文件,只是这个过程需要解释器的参与,所以说脚本语言与解释型语言有很大的联系。脚本语言通常是被解释执行的,而且程序是文本文件。

典型的脚本语言有,JavaScriptPythonshell等。

其他常用的脚本语句种类

PHP是网页程序,也是脚本语言。是一款更专注于web页面开发(前端展示)的脚本语言,例如:Dedecms,discuzPHP程序也可以处理系统日志,配置文件等,php也可以调用系统命令。

Perl脚本语言。比shell脚本强大很多,语法灵活、复杂,实现方式很多,不易读,团队协作困难,但仍不失为很好的脚本语言,存世大量的程序软件。MHA高可用Perl写的

Python,不但可以做脚本程序开发,也可以实现web程序以及软件的开发。近两年越来越多的公司都会要求会Python

Shell脚本与php/perl/python语言的区别和优势?

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

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

系统环境说明

[root@clsn scripts]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 
[root@clsn scripts]# uname -r
3.10.0-693.el7.x86_64
[root@clsn scripts]# getenforce 
Disabled
[root@clsn scripts]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

1.1.5 系统中的shell

查看系统中的命解释器

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

常用操作系统的默认shell

1.LinuxBourne Again shellbash

2.SolarisFreeBSD缺省的是Bourne shellsh

3.AIX下是Korn Shellksh

4.HP-UX缺省的是POSIX shellsh

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

bash版本

[root@clsn scripts]# bash -version
GNU bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
许可证 GPLv3+: GNU GPL 许可证版本3或者更高 <http://gnu.org/licenses/gpl.html>

这是自由软件,您可以自由地更改和重新发布。
在法律允许的范围内没有担保. 

bash 破壳漏洞

使用 命令 env x='() { :;}; echo be careful' bash -c "echo this is a test"
如果返回结果为一行,则为正常,
 [root@clsn ~]# env x='() { :;}; echo be careful' bash -c "echo this is a test"
 this is a test
 
#解决办法 升级当前的bash版本
 yum install update bash

shbash 的关系

[root@clsn ~]#  ll /bin/sh
lrwxrwxrwx. 1 root root 4 11月 13 11:15 /bin/sh -> bash

/bin /user/bin 的关系

[root@clsn ~]# ll /bin -d
lrwxrwxrwx. 1 root root 7 11月 13 11:15 /bin -> usr/bin

1.2 脚本书写规范

1.2.1 脚本统一存放目录

[root@clsn ~]# mkdir -p /server/scripts/
[root@clsn ~]# cd /server/scripts/

1.2.2 选择解释器

注意格式

其中开头的"#!"字符又称为幻数,在执行bash脚本的时候,内核会根据"#!"后的解释器来确定该用那个程序解释这个脚本中的内容。

[root@clsn scripts]# head -1 /etc/init.d/*
==> /etc/init.d/functions <==
# -*-Shell-script-*-

==> /etc/init.d/netconsole <==
#!/bin/bash

==> /etc/init.d/network <==
#! /bin/bash

1.2.3 编辑脚本使用vim

使用 .vimrc 文件,能够快速的生成开头的注释信息

[root@clsn scripts]# cat  ~/.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: clsn")
        call setline(6, "# Organization: http://blog.znix.top")
        call setline(7, "# Created Time : ".strftime("%F %T"))
        call setline(8, "# Description:")
        call setline(9, "##############################################################")
        call setline(10, "")
    endif
endfunc

使用后的效果

[root@clsn scripts]# cat  scripts_test.sh 
#!/bin/bash
##############################################################
# File Name: scripts_test.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-04 11:39:57
# Description:  First scripts file
##############################################################

Shell脚本中,跟在#后面的内容表示注释。注释部分不会被执行,仅给人看。注释可以自成一行,也可以跟在命令后面,与命令同行。要养成写注释的习惯,方便自己与他人。

最好不用中文注释,因为在不同字符集的系统会出现乱码(字符集为zh_CN.UTF-8,为中文)

1.2.4 文件名规范

         名字要有意义,并且结尾以 .sh 结束

1.2.5 开发的规范和习惯小结

1) 放在统一的目录

2) 脚本以.sh为扩展名

3) 开头指定脚本解释器。

4) 开头加版本版权等信息,可配置~/.vimrc文件自动添加。

5) 脚本不要用中文注释,尽量用英文注释。

6) 代码书写优秀习惯

  a、成对的内容一次性写出来,防止遗漏,如[  ]' '" "

  b[  ]两端要有空格,先输入[  ],退格,输入2个空格,再退格写。

  c、流程控制语句一次书写完,再添加内容。(if 条件 ; then  内容;fi)ddd

  d、通过缩进让代码易读。

  f、脚本中的引号都是英文状态下的引号,其他字符也是英文状态。

1.3 shell脚本的执行

1.3.1 执行脚本的办法

sh/bash   scripts.sh 
chown +x   ./scripts.sh  && ./scripts.sh  
source scripts.sh
. (空格) scripts.sh
cat oldboyedu.sh |bash  # 效率较低

source . (点) 的作用

soucre命令

[root@clsn ~]# help source  |head -2
source: source 文件名 [参数]
    在当前 shell 中执行一个文件中的命令。

. ()

[root@clsn scripts]# help . |head -2
.: . 文件名 [参数]
    在当前 shell 中执行一个文件中的命令。

1.3.2 sh source的区别

[root@clsn scripts]# sh  clsn_test.sh 
Hello World!
[root@clsn scripts]# echo $clsn
#  sh  新建一个Shell窗口(新建一个进程)执行一个文件中的命令。

[root@clsn scripts]# source clsn_test.sh 
Hello World!
[root@clsn scripts]# echo $clsn
Hello World!

面试题:

sh test.shecho $user返回的结果___ ?

[root@oldboy scripts]# cat test.sh 
#!/bin/bash
user=`whoami`

1.4 Shell的变量

1.4.1 什么是变量

变量可以分为两类:环境变量(全局变量)和普通变量(局部变量)

  环境变量也可称为全局变量,可以在创建他们的Shell及其派生出来的任意子进程shell中使用,环境变量又可分为自定义环境变量和Bash内置的环境变量

  普通变量也可称为局部变量,只能在创建他们的Shell函数或Shell脚本中使用。普通变量一般是由开发者用户开发脚本程序时创建的。

         特殊变量

1.4.2 环境变量

使用 env/declare/set/export -p 命令查看系统中的环境变量,这三个命令的的输出方式稍有不同。

[root@clsn scripts]# env
XDG_SESSION_ID=1
HOSTNAME=clsn
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.0.0.1 5537 22
SSH_TTY=/dev/pts/0
USER=root
~~~

         输出一个系统中的 环境变量

[root@clsn ~]# echo $LANG
zh_CN.UTF-8

1.4.3 普通变量

本地变量在用户当前的Shell生存期的脚本中使用。例如,本地变量OLDBOY取值为bingbing,这个值在用户当前Shell生存期中有意义。如果在Shell中启动另一个进程或退出,本地变量值将无效       

Shell分类详解(图形界面+命令行式) Shell的两大分类详解 阅读详情

相关推荐

shell编程(一)—— 基础

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问 Linux 内核的服务。Shell 脚本(shell script),是一种为 shell 编写的脚本程序,一般文件后缀为 .sh

xiaoyuzhou1994的博客 3655

通过脚本实现操作的自动化

了解Shell脚本如何实现所有个人或系统任务自动化。脚本可以执行监视、存档、更新、报告、上载和下载操作。实际上,任务无论大小,均可通过脚本来处理。下面是简介: 如果您曾经在资深UNIX®用户工作时站在他的背后注视屏幕,可能会对命令行上不断滚动的咒语般的奇怪内容感到相当迷惑。如果您阅读过对话UNIX系列中以前的文章(请参见参考资料),那么至少所输入的某些诗一般的神秘内容——如波形符(~)、...

weiyinchao88 968

Shell脚本编程30分钟入门

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34345560的博客 105

Linux shell 脚本编程-高级 (二)

继 Linux shell 脚本编程-高级 (一) 2. 图形化桌面环境中的脚本编程   2.1 创建文本菜单 创建交互式 shell 脚本最常用的方法是使用菜单。提供各种选项可以帮助脚本用户了解脚本能做什么和不能做什么。   通常菜单脚本会清空显示区域,然后显示可用的选项列表。用户可以按下与每个选项关联的字母或数字来选择选项。 shell 脚本菜单的核心是 case 命令。ca...

devalone 的专栏 1889

shell编程基础

文章目录基础一、Shell概述二、脚本定义与执行三、shell中的变量四、运算符五、条件判断六、流程控制七、read读取控制台输入八、函数九、Shell工具 基础 一、Shell概述 shell是一个功能比较强大的脚本语言,易编写、易调试、灵活性强。它负责接收应用程序用户命令,然后调用操作系统内核对用户态的接口,开发和运维都应该掌握。 Linux提供的Shell的种类很多,centos7中提...

明月沉江春雾晓 4360

shell编程- -高级

http://www.cnblogs.com/jiqing9006/p/3253232.html

qq_19646075的博客 424

Linux学习12——Shell编程入门与Shell编程基本语法详解大全、学习Shell基础看这就够了(常用变量类型、Shell运算符、流程控制、函数)

在 Linux 系统中,Shell 是用户与系统内核之间交互的桥梁,用于接受用户所给出的指令,并将其解释为内核能够理解的指令,最终完成相关的操作并返回结果给用户,平时所使用的 ls、cd等指令,也都是通过 Shell 来执行的。而Shell 编程,则是将一系列的 Shell 指令按照一定的语法规则组织到一个文件中,形成可执行性的脚本文件(其拓展名一般都以 .sh 结尾)。通过运行这个脚本文件,系统会按顺序执行其中的命令,从而实现自动化的任务处理。在Shell编程中,变量定义的基本格式为变量名=值,

buyutang_的博客 1792

[授权发表]Shell编程范例之总结

这是《Shell编程范例序列》第九章,到这里,整个shell编程序列就要结束了,作为总结,主要回顾一下各个小节的主要内容,并总结出shell编程的一些常用框架和相关注意事项等。

727

Shell 编程 入门(打好基础):

文章目录1、Shell 编程的脚本格式:2、分享一个自动给脚本添加注释的文件:3、使用 bash -n 命令查看脚本语法问题:4、使用 bash -x 查看脚本输出内容:         此链接通往 Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:     1、Shell 编程的脚本格式: 1: 脚本名字格式: ...

郑泽林 477

SHELL脚本编程基础

成功不易,加倍努力!七 SHELL脚本编程1 编程基础1.1 程序组成1.2 程序编程风格1.3 编程语言1.4 编程逻辑处理方式2 shell 脚本语言的基本结构2.1 shell 脚本的用途2.2 shell脚本基本结构2.3 创建shell脚本过程2.4 脚本注释规范2.5 脚本调试2.6 变量2.7 格式化输出 printf2.8 算术运算2.9 逻辑运算2.10 条件测试命令2.11 关...

崔庆贺的博客 1223

shell脚本编程基础

shell脚本编程 编程小知识 程序:程序由算法+数据结构组成 数据:数据是程序的核心 数据结构:数据在计算机的类型和组织方式 算法:处理数据的方式 过程式编程:以指令为中心,数据服务于指令 对象式编程:以数据为中心,指令服务于数据 高级编程语言: 编译:高级语言–>编译器–>机器代码–>执行   C,C++ 解释:高级语言–>执行–>解释器–>机器代码  ...

wdirdo的博客 451

shell编程基础

第一章 什么是shell shell的定义 在计算机科学中,Shell就是一个命令解释器。 shell是位于操作系统和应用程序之间,是他们二者最主要的接口,shell负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。 shell位置图 总结: 一句话,shell就是在操作系统和应用程序之间的一个命令翻译工具。 shell的分类 命令行式shell win...

weixin_43250623的博客 289

shell 编程 】第1 变量

shell 编程 】第1 变量

guanguan12319的博客 533

ubuntu shell编程基础

1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh   符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。(可以运行echo $SHELL来看你的系统是使用那一类shell, 比如ubuntu使用的是/bin/bash,则第一行写成#

sunboy8764的专栏 3万+

shell编程基础

重点注意,我们这里介绍的是CentOS 6.7 版本的Linux 一、shell的介绍  (1)什么是shell?        shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出的结果,输出到屏幕返回给用户。这种对话方式可以是交互式的(从键盘输入,立刻得到shell的回应),或者非交互式的。Shell:是一门弱类型(...

weixin_33998125的博客 145

Shell编程基础-

1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 -f文件,f的全拼为file 文件存在且为普通文件则为真,即测试表达式成立 -e文件,e的全拼为exist 文件存

惨绿少年 | 欢迎访问CLSN博客站点 http://clsn.io 410
上一篇: Jenkins与网站代码上线解决方案
下一篇: memcached 缓存数据库应用实践
惨绿少年
博客等级 码龄9年 173粉丝 236原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值