Shell脚本系列教程二: 开始Shell编程
Shell脚本系列教程二: 开始Shell编程
2.1 如何写shell script?
(1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器;
(2) 脚本写好之后, 要给脚本设置可执行权限: 语法为: chmod [option] mode script-name
$ chmod +x script-name # 对所有用户(a, 默认)
$ chmod script-name
这里, 775这3个数字分别表示此文件对于用户(u), 组(g), 其他用户(o)的权限设置, 比如: 第一个7,二进制为111,表示分别表示赋予了用户此文件的读, 写, 执行权限;
who: u(用户), g(组), o(其他), a(所用用户, 默认); opcode: +(增加权限), -(删除权限), =(重新分配权限); permission: r(读权限), w(写权限), x(执行权限), s(设置用户ID号), t(粘着位)
$ chmod u+x file # 给此file的用户添加执行权限
$ chmod # 给此file的用户读写执行权限,file所在组读,执行权限,其他用户执行权限
$ chmod u=rwx,g=rx,o=x file # 和上一条语句含义相同
$ chmod =r file # 给所有用户分配读权限(默认的用户为a,这里就是默认了)
$ chmod file # 和上条语句完全相同
$ chmod a-wx,a+r file # 同上条语句, - 表示去除权限
$ chmod +R u+r directory # 递归地给directory目录下所有文件和子目录分配读的权限
(3) 使用下面的命令来执行脚本:
$ bash script-name 或 $ sh script-name 或 $ ./script-name (你的终端当前路径是本脚本所在路径, 但是还是要加上"./", 这样才会从当前文件夹来找这个文件);如果只有一个.(dot)表示在当前的shell里面执行给定的文件: 语法为: . command-name (可以参考[2]).
下面, 写下自己的第一个shell脚本: 命名为first
$ clear
$ echo "Hello World"
对脚本进行保存之后,你可能会使用下面的命令来执行脚本:
$ ./first
这种方式不得行,因为这个脚本现在还没有执行权限,要给脚本加上执行权限方可执行: 屏幕会被清空,Hello World将会被打印到屏幕上.
$ chmod first
$ ./first
| 脚本命令 | 含义 |
| clear | 清空屏幕 |
| echo "Hello World" | 在屏幕上输出信息或者变量的值,这里使echo命令的一般使用方法: echo "Message" |
练习: 写如下的脚本, 保存然后执行, 观测输出
ginfo
clear
echo "Hello $USER"
echo "Today is \c";date
echo "Number of user login :\c";who | wc -l
echo "Calendar"
cal
exit
输出:
Hello wang
Today is \c
2016年 11月 04日 星期五 :: CST
Number of user login :\c Calendar
十一月
日 一 二 三 四 五 六
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路径, 可以:
$ echo $HOME # 输出: /home/wang
但是下面可以这样吗? 下面这条命令是ok的, 不会出现任何错误, 但是它会输出HOME, 而不是HOME所指代的内容, 要在HOME前面加上$才行.
$ echo HOME # 输出: HOME
2.3 如何定义/输出用户定义变量
用户定义自己的变量: 语法: variable name=value
$ no= # 正确
$ =no # 错误, 值必须在等号的右侧
$ vech=Bus # Bus是个字符串
$ n=
准则: 1)变量名的定义必须以字母或者下划线开头;2)赋值的时候,等号的左右侧都不能有空格;3)变量名对大小写敏感;4)可以定义NULL变量;5)变量名里面不能有*,?等.
# 2) 等号的左右不能有空格
$ n =
n: command not found
$ n=
: command not found
$ n =
n: command not found
$ n= # 正确
# 3)变量名对大小写是敏感的,下面这四个变量是不相同的!!
$ no=
$ No=
$ NO=
$ nO=
# ) 定义NULL变量
$ vech=
$ vech=""
# 5) 变量名里面不能有*
$ a*=
a*=: command not found
如何打印输出自定义变量?
定义变量vech和n,然后打印输出(在变量名前面加上$):
$ vech=Bus
$ n=
$ echo vech
Bus
$ echo $n
10
$ echo vech # 这里没有输出vech的内容,而是把vech当做是字符串
vech
练习:
1.定义变量x的值为10,并且打印到屏幕:
$ x=
$ echo $x
2.定义变量xn的值为Rani,并且打印到屏幕:
$ xn=Rani
$ echo $xn
Rani
3.如何打印输出两个数:6和3之和?
$ echo `expr + ` # +两边有空格 $ echo `expr +` # +两边忘记加空格了
+
4.定义两个变量x=20,y=5,打印输出x除以y的值:
$ x=
$ y=
$ echo `expr $x / $y` # /的两边同样要有空格
5. 将4中的x/y的值赋值给z:
$ z=`expr $x / $y`
$ echo $z
2.4 echo命令
echo命令用于显示文本或者变量的值:echo [options] [string, variables ...]
options:
-n
-e 表示在字符串中启用下面的这些制表符:
\a 发出"噔"的一声警告!
\b backspace删除键
$ echo -e "Hello\bBaby"
HellBaby
\c
\n 开新行
$ echo -e "Hello\nBaby" # 两行显示
Hello
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)运算符两边都有空格
$ expr + $ expr - $ expr / $ expr % $ expr \* # 特别注意,乘号需要转义 $ echo expr + # 看看这个是什么原因?
expr +
$ echo "expr 6 + 3" # 看看这个是什么原因?
expr +
$ echo 'expr 6 + 3' # 看看这个是什么原因?
expr +
$ echo `expr + ` # 这个才是正确的
注意最后一条语句,正确的写法应该是:$ echo `expr + ` .注意,这里用的不是单引号,更不是双引号,而是后引号(``).当一个命令被后引号引住的时候,此命令将被执行,我们将得到它的输出.
2.6 读语句(read)
从键盘上读取数据存放在变量中: 语法: read var1, var2, ..., varN
编写下面的脚本文件, 提示用户输入名字, 用户使用键盘输入名字, 存放在指定的变量中, 然后显示:
$ vi sayH
echo "Your first name please: "
read fname # 用户的输入存放在fname里面!!!
echo "Hello $fname, Lets be friend!"
执行下面的语句运行sayH:
$ chmod +x sayH
$ ./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编程的更多相关文章
- Shell脚本笔记(二)Shell变量
Shell变量 一)全局环境变量 全局变量对于定义它的shell和其子shell都是可见的,但如果生成它的shell被终止,全局变量也就消失了.另外全局变量会被子shell的同名变量覆盖. #定义一个 ...
- NGUI系列教程二
接下来我们创建一个Label,NGUI->Open the Widget Wizard,打开widgetTool对话框,在Template中选择Label,确定AddTo右侧选项为panel,点 ...
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- C#微信公众号开发系列教程二(新手接入指南)
http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...
- Android Studio系列教程二--基本设置与运行
Android Studio系列教程二--基本设置与运行 2014 年 11 月 28 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处! 上面一篇博客,介绍了Studio的 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...
- shell脚本中执行另一个shell脚本
分类: 可以在一个shell脚本中执行另一个shell脚本(或非可执行文件,主要用于取得一些变量的值),方法是: . 文件名(包括路径) 或 变量=文件名(包括路径) . $变量 注意,圆点后面有 ...
- Fastify 系列教程二 (中间件、钩子函数和装饰器)
Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) 中间件 Fastify 提供了与 Express 和 Restify ...
随机推荐
- Alpha 冲刺 —— 十分之八
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 多次测试软件运行 学习OPENMP ...
- Linux内核分析第八周——进程的切换和系统的一般执行过程
Linux内核分析第八周--进程的切换和系统的一般执行过程 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...
- Python之旅:并发编程之多线程理论部分
一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 车间负责把资源整合 ...
- Lnmp上安装Yaf学习(二)
上一节主要实践了在Lnmp上安装Yaf扩展,那么这一节将测试 Yaf 的一个简单demo的运行. 一.通过Lnmp 创建 vhost 文件 [root@localhost yaf-3.0.6]# ln ...
- 交互式shell脚本对话框----whiptail指令
当你在linux环境下setup软件的时候就会有相应的对话框让你输入.虽然我们已经习惯了这种交互的方法,但是如果有一种直观的界面来输入是不是会更加友好和方便呢,在shell脚本中你可以使用-whipt ...
- opencv图片右转函数
因为需要将函数进行右转,发现opencv自带 的过于麻烦.自己写了个右转的.可以根据这个想法写出任何方向的 //函数功能,右转图片 IplImage* convertImage(IplImage* i ...
- 【Asp.net入门03】第一个ASP.NET 应用程序-创建ASP.NET项目
本部分主要内容: 创建并运行Asp.net项目 web窗体 数据模型 调用代码隐藏方法 数据验证 1.操作步骤 第一步:启动Visual Studio 2013,然后从File(文件)菜单中选择New ...
- 《剑指offer》 面试题53 :正则表达式匹配 Java
引言:这道题情况比较复杂,边界条件较多,为了便于以后复习,整理一下.另外,由于C语言和Java对于字符串的操作存在不一样的地方,代码也存在改动. 题目:请实现一个函数用来匹配包含'.'和'*'的正则表 ...
- [Java] 集合框架原理之二:锁、原子更新、线程池及并发集合
java.util.concurrent 包是在 Java5 时加入的,与 concurrent 的相关的有 JMM及 AbstractQueuedSynchronizer (AQS),两者是实现 c ...
- python---函数补充(变量传递),语句执行顺序(入栈顺序)
一:函数补充 默认作为函数参数的数据,是浅拷贝传递.不是和C等语言一样,产生一个临时变量. class T: def __init__(self,num): print(id(num)) self.n ...