为什么要使用shell脚本?

shell脚本能够轻易处理文件与目录之类的对象,而且是各UNIX系统之间经过POSIX标准化的通用的功能,因此Shell脚本只要“用心写”一次,即可应用到很多系统上,因此之所以要使用Shell脚本是基于:

  • 简单性:Shell是一个高级语言,通过它,你可以简洁地表达发杂的操作;
  • 可移植性:使用POSIX所定义的功能,可以做到脚本无须修改就可以在不同的系统上执行;
  • 开发容易:可以在短时间内完成一个功能强大又好用的脚本;

第一个shell脚本

cat > testshell                    建立文件,使用cat复制终端输入
who | wc -l 程序内容
^D Ctrl-D表示end-of-file
$ chmod +x testshell 让文件拥有执行权限
$ ./testshell 执行测试

当Shell执行一个程序时,会要求UNIX内核启动一个新的进程(process),以便在该进程里执行所制定的程序。当Shell要求内核执行它时,内核无法做这件事,因为它不是编译型程序,于是回应“not executable format file”(不是可执行的格式文件)错误信息。Shell收到此错误信息时,就会认为“既然不是编译型程序,那就一定是Shell脚本”,于是会启动一个新的/bin/sh(标准Shell)副本来执行该程序。

如上述当系统只有一个Shell(/bin/sh)时还行,但现行的UNIX系统都会拥有好几个Shell,那么我们就需要一种方式来告诉UNIX内核该启用那个Shell来执行,这种方式就是:在第一行的开头除使用#!这两个字符,其后跟Shell的具体路径。如:

#! /bin/sh
who | wc -l

#!后的Shell还可以被传参数。

Shell识别三种基本命令:内建命令、Shell函数以及外部命令:

  1. 内建命令就是由Shell本身所执行的命令。

    • 有些命令是由于其必要性才内建的,例如cd用来改变目录、read会将来自用户(或文件)的输入数据传给Shell变量;
    • 另一种内建命令存在则是为了效率,其中最典型的就是test命令,编写脚本时经常用到它;
    • 还有I/O命令,如echo和printf;
  2. Shell函数是功能健全的一些程序代码,以Shell语言写成,他们可以像命令那样引用。
  3. 外部命令就是由Shell的副本(新的进程)所执行的命令,基本过程如下:
    • 建立一个新的进程,此进程即为Shell的一个副本;
    • 在新的进程里,在PATH变量内所列出的目录中,寻找特定的命令。/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin为PATH变量典型的默认值。当命令名称含有斜杠(/)符号时,将略过路径查找步骤;
    • 在新的进程里,以所找到的新程序取代执行中的Shell程序并执行;
    • 程序完成后,最初的Shell会接着从终端读取下一条命令,或执行脚本里的下一条命令,如下图

变量

Shell变量名称的开头是一个字母或下划线符号,后面可以接字母、数字或下划线符号。变量赋值:

变量名=变量值

=号左右没有空格,当使用变量时,只需要在变量名前加上”$“符号.如:

#! /bin/sh
website=oseye.net
echo $website #单行可以进行多次赋值
name=kevin age=22 sex=f
#值中包含空格时使用引号
address="guandong china"
#变量赋给别的变量
address2=$address
#当几个变量组合赋给变量可以使用双引号
info="$name $age $address" echo $info

printf

由于echo有版本上的差异,会导致在UNIX版本间很难移植,因此我们一般使用最简单的echo形式,而我们常用的是prinf命令,它别echo更灵活和强大。printf命令模仿C程序库里的printf,它几乎复制了该函数的所有功能,可也查看man手册。

I/O重定向

标准输入/输出是软件设计原则里非常重要的概念:程序应该有数据的来源端、数据的目的端以及报告问题的地方,他们粉笔被称为标准输入(standard input)、标准输出(standard output)以及标准错误输出(standard error).

Shell提供了数种语法标记,可用来改变默认I/O的来源端和目的端,如<改变标准输入、>改变标准输出、>>附加到文件、|建立管道。

特殊文件:/dev/null和/dev/tty
这是UNIX系统提供了两个对Shell编程特别有用的两个特殊文件:

  • /dev/null是大家所熟知的位桶(bit bucket),传送到此文件的数据会被操作系统丢掉,相对地,读取它则会立即返回文件结束符号。
  • /dev/tty是当前进程的控制终端文件,当程序打开此文件时,UNIX会自动将它重定向到一个终端,在程序必须读取人工输入时特别有用,用它产生错误信息也很不错,只是很少有人这样用。

命令查找:也是在$PATH路径中查找,但Linux的PATH与Windows的PATH不同是用“:”分隔,而不是“;”,可与修改.profile来永久生效PATH.
脚本参数:可与在执行脚本的时候对它传参,各参数都是通过整数来命名,基于历史的原因,当它超过9个就要大括号把数字括起来,如:

#! /bin/sh
echo $1
echo ${10}

执行跟踪

为了调试Shell可打开跟踪(execution tracing)功能,有两种方式:向sh传递参数和shell通过set来设置。

sh -x testshell #可与通过man sh查看sh的参数帮助
#! /bin/sh
set -x #打开跟踪功能
echo a
echo b
set +x #关闭跟踪功能
echo c

《shell脚本学习指南》学习笔记之入门的更多相关文章

  1. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  2. WebSocket学习笔记——无痛入门

    WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报  分类: 物联网学习笔记(37)  版权声明:本文为博主原 ...

  3. Java学习笔记之---入门

    Java学习笔记之---入门 一. 为什么要在众多的编程语言中选择Java? java是一种纯面向对象的编程语言 java学习起来比较简单,适合初学者使用 java可以跨平台,即在Windows操作系 ...

  4. DBFlow框架的学习笔记之入门

    什么是DBFlow? dbflow是一款android高性的ORM数据库.可以使用在进行项目中有关数据库的操作.github下载源码 1.环境配置 先导入 apt plugin库到你的classpat ...

  5. MongoDB学习笔记:快速入门

    MongoDB学习笔记:快速入门   一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...

  6. 学习笔记_J2EE_SpringMVC_01_入门

    1.    概述 笔者作为一个不太正经的不专业佛教信仰者,习惯了解事物的因果关系,所以概述就有点BBB...了.如果不喜欢这些的,请自行跳过概述章节,直接进入第二章的操作实践:2 入门示例. 1.1. ...

  7. dubbo入门学习笔记之入门demo(基于普通maven项目)

    注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...

  8. SpringBoot学习笔记<一>入门与基本配置

    毕业实习项目技术学习笔记 参考文献 学习视频 2小时学会Spring Boot:https://www.imooc.com/learn/767 学习资料 SpringBoot入门:https://bl ...

  9. 图解HTTP学习笔记——简单的HTTP协议

    简单的HTTP协议 前言 最近在学习Web开发的相关知识,发现<图解HTTP>这本书通俗易懂.所以花时间学习这本书,并记录下学习笔记. 如上图,我们每天都在浏览网页,一般我们都是在浏览器地 ...

  10. [学习笔记]SiftGPU入门

    当有读者看到我这篇SiftGPU入门的学习笔记时,相信你已经读过了高博那篇<SLAM拾萃:SiftGPU>,那篇文章写于16年,已经过去两年的时间.在我尝试配置SiftGPU的环境时,遇到 ...

随机推荐

  1. 兼容ie6及以上和firefox等标准浏览器的表格行滑过时背景色切换的效果

    一.js代码——"tablehover.js" /**      *②.表格单元行滑过时高亮样式动效组件封装      *oop形式封装交互动效类      *组件说明这个组件是为 ...

  2. 浅谈Java工具类CommonUtils的使用

    package com.xushouwei.cn; import java.util.HashMap; import java.util.Map; import org.junit.Test; imp ...

  3. HTML5 + AJAX ( 原生JavaScript ) 异步多文件上传

    这是在上篇 HTML5 + AJAX ( jQuery版本 ) 文件上传带进度条 的修改版本.后台代码不变就可以接着使用,但是脚本不再使用jQuery了,改为原生的 JavaScript 代码,所以我 ...

  4. jquery 组合键键盘事件

    jQuery处理键盘事件,比如小说网站中常见的按左右键来实现上一篇文章和下一篇文章,按ctrl+回车实现表单提交,google reader和有道阅读中的全快捷键操作... 本文讲述jQuery处理按 ...

  5. Typescript中的Class

    let btn = document.createElement('button'); btn.textContent = 'Say Hello'; document.body.appendChild ...

  6. python 安装与pip安装

    在大二的时候接触过一段时间的Python,最近又开始玩起了这门语言.总的来说,个人很喜欢Python的语言风格,但是这门语言对于windows并不算很友好,因为如果是初学者在windows环境下安装, ...

  7. VoiceEngine获取硬件信息

    #include "webrtc\voice_engine\include\voe_base.h" #include "webrtc\voice_engine\inclu ...

  8. [心得]传统IT转互联网面试经验分享

    http://www.newsmth.net/bbstcon.php?board=Java&gid=374779 传统IT外企干了8年,两年前转互联网的,面的和被面的都不少.这几天项目空档期, ...

  9. php知识点总结(一)

    1.把数组以表格的形式显示 <?php $array = array( '书籍' =>  array( '生活',  '人与自然','动物世界'), '体育用品' =>  array ...

  10. 《微信小程序七日谈》- 第六天:小程序devtool隐藏的秘密

    <微信小程序七日谈>系列文章: 第一天:人生若只如初见: 第二天:你可能要抛弃原来的响应式开发思维: 第三天:玩转Page组件的生命周期: 第四天:页面路径最多五层?导航可以这么玩: 第五 ...