由于我平时的工作环境是linux,所以无可避免的经常使用命令行模式和shell脚本,而且有些命令行每天都要输好多遍,比如ssh登录之类的,所以干脆把平时常用的命令都写成脚本文件,所以特意开了一个shell脚本的分类,用来记录学习shell的过程,以便温习。

  • 首先我们从一个简单的脚本来开启shell学习的大门,假设你想要知道当前系统中有多少人登录,可以使用 who 命令来查询:
 $ who
george pts/ Dec :
betsy pts/ Dec :
  • 但如果在多用户系统上信息量会很大,在统计时很麻烦,所以我们可以使用通道和wc 程序来统计行数(line)、字数(word)与字符数(character),本例中为统计登录人数所以查询行数即可。
 $ who | wc -l
  • 注意:| (管道)符号可以在两个程序之间建立管道:即who 的输出变成了wc 的输入
  • 接下来就可以将其转变为一个小型的脚本文件,将上述命令写入一个一般文本文件中,然后赋予执行权限执行即可,这也展现了脚本文件的开发周期,可以先在命令行进行测试开发,无误后写入文件.
 $ vi wc.sh
#进入文本编辑模式,将命令who | wc -l写入,保存退出
$ chmod +x wc.sh #赋予该脚本文件执行权限
$ ./wc.sh #执行脚本
$ #获得输出结果
  • 在很多脚本的第一行都会有#! 这两个字符,这两个字符的含义是告知linux内核应该以哪种shell来执行当前脚本,当前大多数脚本都是使用#!/bin/sh ,也有使用#!/bin/csh (是C shell的解释器)
 $ cat wc.sh

#!/bin/sh
who | wc -l
  • 分号; 可用来分割同一行里的多条命令,Shell会依次执行的,如果使用了& 符号,则代表当前命令是后台执行,即不需要等到当前命令执行完毕就可以继续执行下一条命令
  • 变量:Shell变量的名称的开头是一个字母或者下划线符号,后面可以接任意长度的字母、数字和下划线符号,并且变量长度没有限制;变量赋值的方式为:先写变量名称,紧接着= 字符,最后是赋予的值,中间没有空格,当你想取用变量的值则需要在变量的名称前使用$ 字符。
 $ value=this_is_a_long_value #当赋予的值中存在空格时,需要引号括起来
$ echo $value
$ this_is_a_long_value
  • 输出命令:大多数人可能习惯使用echo命令来进行简单的输出,但要知道echo是由版本差异的,所以移植是一个可能存在风险的问题,相对来看,还是比较推荐使用printf命令,printf命令几乎完全把c里的printfcopy下来,所以c中的格式化字符也同样适用的。
 $ printf "hello world.\n" # printf不会像echo那样隐式添加一个换行符,所以需要手动添加换行符\n
$ printf “The first program always prints %s %s.\n” Hello World
  • 重定向:以< 改变标准输入,以 > 改变标准输出
 program < file 可以将program的标准输入修改为file
eg. tr -d ‘\r’ < test.file #这条命令会将test.file文件中的回车符删除掉 program > file 可以将program的标准输出修改为file
eg. tr -d ‘\r’ < test.file > result.file #这条命令会先将test.file中的回车删除,再将处理完的数据输出到result.file中,但test.file中的数据不会发生改变 #注意:> 重定向符在目的文件不存在时会自动新建一个,如果文件已存在则会覆盖原有数据,如果希望追加数据,则需要使用 >> 重定向符
  • 以| 符号建立通道
 program1 | program2 #program2可以将program1的标准输出作为自己的输入

特殊文件 /dev/null 和/dev/tty

 #linux系统提供了两个对Shell编程特别有用的特殊文件
#/dev/null文件
#该文件一般被称为位桶。传送到此文件中的数据都会被系统丢掉,也就是说当程序将数据写入次文件时,从结果上看已经成功写入数据了,但实际上却什么事都没做
#例如测试一个文件是否包含某个模式
if grep pattern myfile > /dev/null
then
printf “find.”
else
printf ”don’t find”
fi

#/dev/tty
#当程序打开此文件时,Linux会自动将它重定向到一个终端再与程序结合
eg.printf “Enter new passed:” #提示输入新密码
stty -echo #关闭自动打印输入字符的功能
read pass < /dev/tty #从当前终端读取密码
printf “Enter again:” #再次输入密码
read pass2 < /dev/tty
stty echo #打开自动打印输入字符的功能
  • stty命令迎来控制终端的各种设置,-echo选项为关闭自动打印每个输入字符的功能,echo选项则是打开该功能
  • 在相对复杂的shell脚本中可以使用set -x 来打开代码追踪功能,使用set +x 来关闭该功能,开启该功能后的代码中,凡是执行过的都会在该行首部添加一个+ 号
 #!/bin/sh
set -x #开启代码追踪功能
value=
if [ “$value”x = “”x ];then #此处在值后面加一个x是规避值为空的情况
printf “value is .\n”
else
printf “value isn’t .\n”
fi
set +x #关闭代码追踪功能
  • 输出结果为:
 + value=
+ if [ “$value”x = “”x ];then
printf “value is .\n” #由于value的值不为0,所以没有执行这句话,所以首部没有+符号
+ else
+ printf “value isn’t .\n”
+ fi
+ set +x

shell教程<入门篇>的更多相关文章

  1. CE修改器使用教程 [入门篇]

    Cheat Engine 一般简称CE,是一个开放源代码的作弊软件,其功能包括:内存扫描.十六进制编辑器.调试工具,Cheat Engine 自身附带了外挂制作工具,可以用它直接生成外挂工具,CE可以 ...

  2. [STemWin教程入门篇]第二期:emWin5.xx的详细移植步骤

    转自:http://bbs.armfly.com/read.php?tid=1545 重要说明:(0)由于这个移植教程是去年过年的时候做的,用的是5.16,这就不再做个5.20的移植了,方法是一样的. ...

  3. shell基础 -- 入门篇

    shell 英文含义是“壳”,这是相对于内核来说的,shell 也确实就像是内核的壳,通常来说,所有对内核的访问都要经由 shell .同时,shell 还是一门功能强大的编程语言.shell 是 L ...

  4. [STemWin教程入门篇] 第一期:emWin介绍

    转自:http://bbs.armfly.com/read.php?tid=1544 SEGGER公司介绍 了解emWin之前,先了解一下SEGGER这家公司,了解生产商才能对emWin有更加全面的认 ...

  5. JqueryEasyUI教程入门篇

    什么是jQueryEasyUI? JqueryUI是一组基于jQuery的UI插件集合 学习jQueryEasyUI的条件? 必须掌握Jquery的基本语法知识 jQueryEasyUI的特点? 1. ...

  6. [转]JqueryEasyUI教程入门篇

    什么是jQueryEasyUI? JqueryUI是一组基于jQuery的UI插件集合 学习jQueryEasyUI的条件? 必须掌握Jquery的基本语法知识 jQueryEasyUI的特点? 1. ...

  7. OpenCV学习教程入门篇&lt;一、介绍&gt;

    OpenCV,是Inter公司开发的免费开源专门因为图像处理和机器视觉的C/C++库,英文全称是Open Source Computer Vision. 1. 可视化语言Matlab与OpenCV都能 ...

  8. 转:jQuery LigerUI 使用教程表格篇(3) 复选框、多表头、分组、汇总和明细

    阅读目录 复选框 多表头 分组 汇总 明细 复选框 grid可以设置复选框模式进行多选,只需要简单的配置 checked:true 获取选中行 如果要获取选中的行,可以用getSelecteds方法: ...

  9. 深度学习入门者的Python快速教程 - 基础篇

      5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用. 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明 ...

随机推荐

  1. RVA到FOA的转换

    地址空间:这个地址空间指的是PE文件被加载到内存的空间,是一个虚拟的地址空间,之所以不是物理空间是因为数据在内存中的位置经常在变,这样既可以节约内存开支又可以避开错误的内存位置.这个地址空间的大小为4 ...

  2. nodejs 编译时对项目进行配置

    1.启动项目设置配置信息 2.读取项目配置文件 3.根据配置的文件读取自定义属性 4.根据相关属性配置其他差异 5.其他

  3. mysql 添加索引语句

    1.PRIMARY  KEY(主键索引)        mysql>ALTER  TABLE  `table_name`  ADD  PRIMARY  KEY (  `column`  ) 2. ...

  4. 015、MySQL取今天是第几季度,往后几个月是第几季度

    #取今天是第几季度 SELECT QUARTER( curdate( ) ); #取往后几个月是第几季度 , INTERVAL MONTH ) ); , INTERVAL MONTH ) ); , I ...

  5. System.Reflection.ReflectionTypeLoadException

    引用了一个第三方dll, 此dll经过混淆,但是未签名. 然后,主程序无法反射了, 取消主程序的签名后正常反射.

  6. leetcode617 Merge Two Binary Trees

    """ Given two binary trees and imagine that when you put one of them to cover the oth ...

  7. NIO三大组件简介

    NIO简介 NIO 是面向缓冲区(或者说面向块)编程的, 因为Buffer底层本质上就是内存块.数据被读取到一个缓冲区, 稍后再被它处理, 需要时数据可在缓冲区前后移动, 从而增加了处理过程中的灵活性 ...

  8. 《从Lucene到Elasticsearch全文检索实战》的P184页

    curl -XPOST "http://localhost:9200/_bulk?pretty" --data-binary @books.json 这句话在书中是以crul的命令 ...

  9. 【LeetCode】226. 翻转二叉树

    题目 翻转一棵二叉树. 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1 本题同[剑指Offer]面试题27. 二叉树的镜 ...

  10. Linus Torvalds正式宣布Linux Kernel 5.1RC2 发布,相当正常

    导读 Linus Torvalds刚刚发布了Linux Kernel 5.2-rc2,这是继上周关闭合并窗口和随后的RC1之后的第一个内核测试版本. 在本周合并后的窗口活动中,Linus评论道,“嘿, ...