由于我平时的工作环境是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. java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver java.sql.SQLException

    今天下午一直想用netbeans连接数据库,结果就是来来回回碰到这两个问题. 我还在想,连接数据库并不是一个什么困难的事情啊,我都按照教程上一步一步做的,代码什么的都感觉很好,怎么就找不到类呢,怎么就 ...

  2. GNS3 模拟icmp路由跟踪

    R1 : conf t int f0/0 no shutdown ip add 192.168.1.1 255.255.255.0 no ip routing end R2 f0/0: conf t ...

  3. express 配置 https 服务 ( 以阿里云服务器为例), 探索一周终于搞定

    首先最重要的是 你要明白 https接口的接收或者发送 的形式 是  https://域名:端口号   而不是 https://ip:端口号   一,首先,去阿里云注册免费ssl证书   1,在搜索框 ...

  4. 题解:luogu P1247

    大概没你们说得复杂吧...... \(Part\;1\) \(Nim\)游戏 大家都对异或和感到懵逼吧(排除大佬),其实很简单,用\(SG\)函数打表计算即可解决: 抛个板子: void get_sg ...

  5. eshop6-nginx

    1. Nginx 是什么? Nginx 是一款轻量级Web服务器,也是一款反向代理服务器 2. Nginx 能干什么 可以直接支持Rails 和PHP 程序 可以作为HTTP反向代理 作为负载均衡服务 ...

  6. spring core:@AliasFor的派生性

    spring对Annotation的派生性应用可谓炉火纯青,在spring core:@Component的派生性讲过支持层次上派生性,而属性上派生的需求则借助了@AliasFor,它是从spring ...

  7. BAT 五路internet负载均衡

    一个网上下载的bat文件 也不记得从那里下载的了 记得似乎需要管理员权限运行 依稀记得测试有效 放在这里做个记录 @echo off echo. echo ╭─────────╮ echo ╭──── ...

  8. 传入sql语句,执行完提取内容赋值到控件上

    class procedure DBTools.FillStrings(ComboBoxEh: TDBComboBoxEh; sql: string; Default: Boolean = False ...

  9. 【转载】UnityWebRequest的初步使用及常用方法解析

    文章来源:https://blog.csdn.net/qwe25878/article/details/85051911#_35 今天,来学习一下Unity新的网络请求方式UnityWebReques ...

  10. NO15 第一关课后考试

    第一关课后考试: 1.创建目录/data/oldboy,并且在该目录下创建文件oldboy.txt,然后在文件oldboy.txt里写如内容:inet addr:10.0.0.8 Bcast:10.0 ...