由于我平时的工作环境是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. jmeter用Stepping Thread Group 递增并发数

    jmeter安装插件Stepping Thread Group 如图所示设置的时候,本以为是每2秒 按 1 2 3 4 递增的,总共请求应该是10个,可是运行后却请求了几十个. 这个是有关线程数是否就 ...

  2. 第1节 IMPALA:10、基本查询语法;11、数据加载的4种方式

    9.3. 创建数据库表 创建student表 CREATE TABLE IF NOT EXISTS mydb1.student (name STRING, age INT, contact INT ) ...

  3. exchange 强制更新全球通讯簿

    ————-客户端强制更新方式————– Outlook通讯录默认情况需要2-3天同步更新通讯录,可以使用下列方式立即更新通讯录 1. 关闭outlook ,打开下列文件夹 %userprofile%\ ...

  4. python里的def 方法中->代表什么意思?

    功能注释 函数注释是关于用户定义函数使用的类型的完全可选元数据信息(请参阅PEP 3107和 PEP 484了解更多信息). 注释__annotations__ 作为字典存储在函数的属性中,对函数的任 ...

  5. android侧滑效果(引用官方网站提供的API文件)

    原文地址:http://www.cnblogs.com/android100/p/android-SlidingMenu.html 在新浪微博和唱吧里面都有看到android的侧滑效果,于是想要学习一 ...

  6. java csv文件写入

    List<String> list_code = null; 方案1 控制字符集: BufferedWriter bw=new BufferedWriter(new OutputStrea ...

  7. js封装、继承

    封装:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html 继承:http://ww ...

  8. 初玩PLSQL连接 Oracle

    1. 官网下载合适的[Instant Client] https://www.oracle.com/database/technologies/instant-client/winx64-64-dow ...

  9. 一些linux基础命令

    linux基本命令: mkdir -p a/b/c (-p 递归创建目录) tree a (a是文件名) :可以查看某个文件的文件结构(ps:a)创建一个.txt文件 touch 文件名.txt 批量 ...

  10. [转载]Jquery Chosen 插件动态生成option或重新绑定

    $(".chosen—select").find("option[value='1']").attr("selected", "s ...