Shell脚本系列教程二: 开始Shell编程

2.1 如何写shell script?

(1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器;

(2) 脚本写好之后, 要给脚本设置可执行权限: 语法为: chmod  [option]  mode  script-name

  1. $ chmod +x script-name # 对所有用户(a, 默认)
  2. $ chmod script-name

这里, 775这3个数字分别表示此文件对于用户(u), 组(g), 其他用户(o)的权限设置, 比如: 第一个7,二进制为111,表示分别表示赋予了用户此文件的读, 写, 执行权限;

who: u(用户), g(组), o(其他), a(所用用户, 默认);  opcode: +(增加权限), -(删除权限), =(重新分配权限);  permission: r(读权限), w(写权限), x(执行权限), s(设置用户ID号), t(粘着位)

  1. $ chmod u+x file # 给此file的用户添加执行权限
  2. $ chmod # 给此file的用户读写执行权限,file所在组读,执行权限,其他用户执行权限
  3. $ chmod u=rwx,g=rx,o=x file # 和上一条语句含义相同
  4. $ chmod =r file # 给所有用户分配读权限(默认的用户为a,这里就是默认了)
  5. $ chmod file # 和上条语句完全相同
  6. $ chmod a-wx,a+r file # 同上条语句, - 表示去除权限
  7. $ chmod +R u+r directory # 递归地给directory目录下所有文件和子目录分配读的权限

(3) 使用下面的命令来执行脚本:

$ bash script-name 或 $ sh script-name 或 $ ./script-name (你的终端当前路径是本脚本所在路径, 但是还是要加上"./", 这样才会从当前文件夹来找这个文件);如果只有一个.(dot)表示在当前的shell里面执行给定的文件: 语法为: . command-name (可以参考[2]).

下面, 写下自己的第一个shell脚本: 命名为first

  1. $ clear
  2. $ echo "Hello World"

对脚本进行保存之后,你可能会使用下面的命令来执行脚本:

  1. $ ./first

这种方式不得行,因为这个脚本现在还没有执行权限,要给脚本加上执行权限方可执行: 屏幕会被清空,Hello World将会被打印到屏幕上.

  1. $ chmod first
  2. $ ./first
脚本命令 含义
clear 清空屏幕
echo "Hello World" 在屏幕上输出信息或者变量的值,这里使echo命令的一般使用方法: echo "Message"

练习: 写如下的脚本, 保存然后执行, 观测输出

ginfo

  1. clear
  2. echo "Hello $USER"
  3. echo "Today is \c";date
  4. echo "Number of user login :\c";who | wc -l
  5. echo "Calendar"
  6. cal
  7. exit

输出:

  1. Hello wang
  2. Today is \c
  3. 2016 11 04 星期五 :: CST
  4. Number of user login :\c
  5.  
  6. Calendar
  7. 十一月

2.2 Shell中的变量

在Linux(Shell)中, 有两种类型的变量:

1) 系统变量: 由Linux自定义和生成的, 都是用大写字母.

2) 用户定义的变量(UDV): 由用户定义和生成的变量.

一些重要的系统变量如下表所示:

系统变量 含义
BASH shell所在路径: 如/bin/bash, 此命令和SHELL相同
BASH_VERSION shell的版本,如: 4.3.11(1)-release
COLUMNS 你的终端的coloums, 如80; 我电脑上,终端最大化后, 此值变成205
HOME 电脑的home路径, 如/home/wang
LINES 和COLUMNS含义差不多
LOGNAME 当前用户名称, 如wang
OSTYPE Os类型: 如linux-gnu
PATH 我们的路径设置
PS1 Our prompt settings
PWD 当前的工作路径
SHELL shell所在路径: 如/bin/bash
UESRNAME 当前登陆到这台PC的用户名称

如果想要打印输出当前的home路径, 可以:

  1. $ echo $HOME # 输出: /home/wang

但是下面可以这样吗? 下面这条命令是ok的, 不会出现任何错误, 但是它会输出HOME, 而不是HOME所指代的内容, 要在HOME前面加上$才行.

  1. $ echo HOME # 输出: HOME

2.3 如何定义/输出用户定义变量

用户定义自己的变量: 语法: variable name=value

  1. $ no= # 正确
  2. $ =no # 错误, 值必须在等号的右侧
  3. $ vech=Bus # Bus是个字符串
  4. $ n=

准则: 1)变量名的定义必须以字母或者下划线开头;2)赋值的时候,等号的左右侧都不能有空格;3)变量名对大小写敏感;4)可以定义NULL变量;5)变量名里面不能有*,?等.

  1. # 2) 等号的左右不能有空格
    $ n =
  2. n: command not found
  3. $ n=
  4. : command not found
  5. $ n =
  6. n: command not found
  7. $ n= # 正确
  1. # 3)变量名对大小写是敏感的,下面这四个变量是不相同的!!
  2. $ no=
  3. $ No=
  4. $ NO=
  5. $ nO=
  1. # ) 定义NULL变量
  2. $ vech=
  3. $ vech=""
  1. # 5) 变量名里面不能有*
    $ a*=
  2. a*=: command not found

如何打印输出自定义变量?

定义变量vech和n,然后打印输出(在变量名前面加上$):

  1. $ vech=Bus
  2. $ n=
  3. $ echo vech
  4. Bus
  5. $ echo $n
  6. 10
    $ echo vech # 这里没有输出vech的内容,而是把vech当做是字符串
    vech

练习:

1.定义变量x的值为10,并且打印到屏幕:

  1. $ x=
  2. $ echo $x

2.定义变量xn的值为Rani,并且打印到屏幕:

  1. $ xn=Rani
  2. $ echo $xn
  3. Rani

3.如何打印输出两个数:6和3之和?

  1. $ echo `expr + ` # +两边有空格
  2.  
  3. $ echo `expr +` # +两边忘记加空格了
  4. +

4.定义两个变量x=20,y=5,打印输出x除以y的值:

  1. $ x=
  2. $ y=
  3. $ echo `expr $x / $y` # /的两边同样要有空格

5. 将4中的x/y的值赋值给z:

  1. $ z=`expr $x / $y`
  2. $ echo $z

2.4 echo命令

echo命令用于显示文本或者变量的值:echo [options] [string, variables ...]

options:

-n

-e  表示在字符串中启用下面的这些制表符:

\a  发出"噔"的一声警告!

\b  backspace删除键

  1. $ echo -e "Hello\bBaby"
  2. HellBaby

\c

\n  开新行

  1. $ echo -e "Hello\nBaby" # 两行显示
  2. Hello
  3. Baby

\r  回车

\t  水平制表符; $ echo -e "Hello\tBaby" output: Hello Baby $ echo -e Hello\tBaby output: HellotBaby

\\  输出一个\,前一个是转义:  echo \\ 得到: \

2.5 Shell算术运算

语法: expr op1 math-operator op2  # 1)用expr; 2)运算符两边都有空格

  1. $ expr +
  2.  
  3. $ expr -
  4.  
  5. $ expr /
  6.  
  7. $ expr %
  8.  
  9. $ expr \* # 特别注意,乘号需要转义
  10.  
  11. $ echo expr + # 看看这个是什么原因?
  12. expr +
  13. $ echo "expr 6 + 3" # 看看这个是什么原因?
  14. expr +
  15. $ echo 'expr 6 + 3' # 看看这个是什么原因?
  16. expr +
  17. $ echo `expr + ` # 这个才是正确的

注意最后一条语句,正确的写法应该是:$ echo `expr + ` .注意,这里用的不是单引号,更不是双引号,而是后引号(``).当一个命令被后引号引住的时候,此命令将被执行,我们将得到它的输出.

2.6 读语句(read)

从键盘上读取数据存放在变量中: 语法: read var1, var2, ..., varN

编写下面的脚本文件, 提示用户输入名字, 用户使用键盘输入名字, 存放在指定的变量中, 然后显示:

  1. $ vi sayH
  2. echo "Your first name please: "
  3. read fname # 用户的输入存放在fname里面!!!
  4. echo "Hello $fname, Lets be friend!"

执行下面的语句运行sayH:

  1. $ chmod +x sayH
  2. $ ./sayH

Your first name please:
Zhao
Hello Zhao, Lets be friend!

通配符

参考文献:

[1] Linux Shell Scripting Tutorial: http://www.freeos.com/guides/lsst/index.html

[2] http://blog.csdn.net/mci2004/article/details/7182829

Shell脚本系列教程二: 开始Shell编程的更多相关文章

  1. Shell脚本笔记(二)Shell变量

    Shell变量 一)全局环境变量 全局变量对于定义它的shell和其子shell都是可见的,但如果生成它的shell被终止,全局变量也就消失了.另外全局变量会被子shell的同名变量覆盖. #定义一个 ...

  2. NGUI系列教程二

    接下来我们创建一个Label,NGUI->Open the Widget Wizard,打开widgetTool对话框,在Template中选择Label,确定AddTo右侧选项为panel,点 ...

  3. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  4. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  5. Android Studio系列教程二--基本设置与运行

    Android Studio系列教程二--基本设置与运行 2014 年 11 月 28 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处! 上面一篇博客,介绍了Studio的 ...

  6. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...

  7. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...

  8. shell脚本中执行另一个shell脚本

    分类: 可以在一个shell脚本中执行另一个shell脚本(或非可执行文件,主要用于取得一些变量的值),方法是: . 文件名(包括路径) 或 变量=文件名(包括路径) . $变量   注意,圆点后面有 ...

  9. Fastify 系列教程二 (中间件、钩子函数和装饰器)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) 中间件 Fastify 提供了与 Express 和 Restify ...

随机推荐

  1. Android自定义 Dialog 对话框

    Android自定义Dialoghttp://www.cnblogs.com/and_he/archive/2011/09/16/2178716.html Android使用自定义AlertDialo ...

  2. 音视频处理之FFmpeg封装格式20180510

    一.FFMPEG的封装格式转换器(无编解码) 1.封装格式转换 所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(对应.avi,.flv,.mkv,.mp4文件). 需要注意的 ...

  3. 《剑指offer》— JavaScript(16)合并两个排序的链表

    合并两个排序的链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. *** 思路 如果pHead1和pHead2中有一个为空,则result是另 ...

  4. Chapter 2(算法)

    附件列表 算法.jpg

  5. 安装JDK、Tomcat、Maven’详细步骤

    安装JDK 1.首先在官网下载JDK1.8包并解压(随便你装哪个版本) 2.下面开始配置环境变量  此电脑-右键-属性-高级系统配置  点击环境变量 将会看到以下界面 在系统变量下“新建” 变量名(J ...

  6. Java入门:绘制简单图形

    在上一节,我们学习了如何使用swing和awt工具创建一个空的窗口,本节学习如何绘制简单图形. 基本绘图介绍 Java中绘制基本图形,可以使用Java类库中的Graphics类,此类位于java.aw ...

  7. PHP变量的传值和引用

    问题: 1.PHP变量的存储.取值方式如何? 2.变量赋值时,普通传值和引用传值分别是什么意思?有何区别? 3.unset被赋值的变量会对两种赋值后原值和新值的影响?   变量的存储.取值形式: 变量 ...

  8. P2776 [SDOI2007]小组队列

    P2776 [SDOI2007]小组队列 题目背景 嘛,这道非常简单的给大家提供信心的省选题洛谷居然没有! 这么简单的题怎么可以没有! 给大家提升士气是义不容辞的责任! 所以我就来补一下啦.. 值得一 ...

  9. Spring知识总结

    一.Spring简述    Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架,Spring致力于提供一种方法管理你的业务对象,Spring的主要目的是使JavaE ...

  10. docker的优势

    基于微服务的架构已经成为一种流行趋势.而Docker则给微服务的蓬勃发展注入了更强的活力. docker的吸引能力主要来自两方面:快速和可移植. 1.快速 普通的虚拟机每次都需要启动一个完整的操作系统 ...