Shell编程入门基础

这篇博客介绍了Shell编程的基础,包括Shell的起源、特点、分类、配置文件,以及如何编写和执行Shell脚本,还讨论了何时不应使用Shell。此外,文章详细讲解了Shell脚本的执行方式、参数传递、内置命令getopts以及脚本的退出状态。
摘要由CSDN通过智能技术生成

Shell简介

shell 是一个命令解释器.是介于操作系统 kernel 与用户之间的一个绝缘层.
准确地说,它也是一种强力的计算机语言.一个 shell 程序,被称为一个脚本,是一种很容易使用的工具,它可以通过将系统调用,公共程序,工具,和编译过的二进制程序粘合在一起来建立应用.事实上,所有的 UNIX 命令和工具再加上公共程序,对于 shell 脚本来说,都是可调用的.如果这些你还觉得不够,那么shell 内建命令,比如 test 与循环结构,也会给脚本添加强力的支持和增加灵活性.Shell 脚本对于管理系统任务和其它的重复工作的例程来说,表现的非常好,根本不需要那些华而不实的成熟紧凑的程序语言.
Shell不仅仅是充当用户与UNIX或者Linux交互界面的角色,还可以作为一种程序设计语言来使用。通过Shell编程,可以实现许多非常实用的功能,提高系统管理的自动化水平。

什么时候不用Shell

资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash 等等)

需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算 (这种情况一般使用 C++或 FORTRAN 来处理)
有跨平台移植需求(一般使用 C 或 Java)

复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)

对于影响系统全局性的关键任务应用。

对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵,破解,恶意破坏等等.

项目由连串的依赖的各个部分组成。

需要大规模的文件操作

需要多维数组的支持

需要数据结构的支持,比如链表或数等数据结构

需要产生或操作图形化界面 GUI

需要直接操作系统硬件

需要 I/O 或 socket 接口

需要使用库或者遗留下来的老代码的接口

私人的,闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)

Shell程序的特点:

1.简单易学
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。
    之后又出现了许多其他的Shell程序,主要包括Tenex C Shell(tcsh)、Korn Shell(ksh)以及GNU Bourne-Again shell(bash)。

Shell的功能

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

Shell的分类

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

Shell配置文件

Bourne Shell (sh)的配置文件主要有2个,分别为每个用户主目录中的 .bash_profile文件以及 /etc/profile文件。
在前面的2个文件中,后者是所有的用户共同使用的文件。每个用户在登录Shell之后,会首先读取和执行/etc/profile文件中的脚本,然后再读取和执行各自主目录中的.profile文件。因此,用户可以将所有用户都需要执行的脚本放在/etc/profile文件中。
Bourne-Again Shell(bash) 的配置文件主要有5个,其中有4个位于用户主目录中,分别为.bash_profile、.bashrc、.bash_logout和.bash_history,有1个位于/etc/目录中,名称为bashrc。
.bash_profile位于每个用户的主目录中,在该文件中用来保存每个用户自己使用的Shell信息。当用户登录时,该文件将被读取并执行,并且该文件仅被执行一次。默认情况下,.bash_profile文件常常用来设置环境变量,执行用户的.bashrc文件。
.bashrc文件包含专属于某个用户的bash的相关信息,当用户登录以及每次打开新的bash时,该文件将被读取并执行。
.bash_logout文件在当前用户每次退出Shell时执行。如果没有特别的要求,该文件的内容通常为空。
/etc/bashrc与sh中的/etc/profile文件非常相似,它是所有的使用bash的用户的共同使用的文件。当任何用户在登录bash后,都会执行该文件中的代码。

Shell脚本程序两种执行方式:

1、交互式执行
2、作为程序文件执行。
通常采用第二种方式较多
交互式程序

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

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

#!/bin/bash 
#选用/bin/bash作为命令解释器
#for循环开始
for filename in `ls /etc/ `
do
      #如果文件名包含xml
      if echo "$filename" | grep "xml"
      then
            #输出文件名
            echo "$filename"
      fi
done

#!
在每个脚本的开头都使用"#!",这意味着告诉你的系统这个文件的执行需要指定一个解释器。在#!之后接着是一个路径名.这个路径名指定了一个解释脚本中命令的程序,这个程序可以是 shell,程序语言或者是任意一个通用程序.这个指定的程序从头开始解释并且执行脚本中的命令(从#!行下边的一行开始),忽略注释.
如:
1 #!/bin/sh
2 #!/bin/bash
3 #!/usr/bin/perl
4 #!/usr/bin/tcl
5 #!/bin/sed -f
6 #!/usr/awk -f
上边每一个脚本头的行都指定了一个不同的命令解释器,如果是/bin/sh,那么就是默认 shell (在 Linux 系统中默认是 Bash).
使用#!/bin/sh,在大多数商业发行的 UNIX 上,默认是 Bourne shell,这将让你的脚本可以正常的运行在非 Linux 机器上,虽然这将会牺牲 Bash 一些独特的特征. 脚本将与 POSIX[4] 的 sh 标准相一致.
注意: #! 后边给出的路径名必须是正确的,否则将会出现一个错误消息,通常是"Command not found",这将是你运行这个脚本时所得到的唯一结果.
当然"#!"也可以被忽略,不过这样你的脚本文件就只能是一些命令的集合,不能够使用 shell 内建的指令了,如果不能使用变量的话,当然这也就失去了脚本编程的意义了.
把脚本设置为可执行
脚本编辑完之后,脚本文件默认无法执行。在Linux中,当用户执行某个程序时,必须拥有该文件的执行权限。
用户使用 chmod u+x /filename.sh 使文件获得执行权限并执行
执行
./test1.sh     从头到尾,用/bin/bash解释器解释当前脚本
source test1.sh 用当前环境下的shell去

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值