原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://twentyfour.blog.51cto.com/945260/505644

****shell 脚本基础知识****

##########实验环境是RHEL5.3,内核2.6.18###########

一、基本脚本编译

知识内容:

# 构建脚本

# 将命令串联起来

# 存储变量

# 数学计算

# 重定向输出

# 检查代码

1、使用多条命令

shell不像高级语言需要编译后执行,而是直接处理每一条命令,可以将多条命令连接起来形成单一的步骤。

如下使用两个bash shell命令,则为一个最简单的shell脚本啦:

[root@wzp ~]# who ; date

root    
:0          
2010-12-13 09:29

root    
pts/0       
2011-01-27 15:12 (:0.0)

2011年 01月 27日 星期四 15:26:42 CST
但如上存在缺点,必须在提示符输入整条命令,所以可以将命令合并到一个文件中,当需要运行命令的时候运行文本文件就行了。

2、创建脚本文件
[root@wzp
~]# cat test1

#!/bin/bash

date

who
通过创建编辑test1文件,具体内容如上

#!/bin/bash指明了该文件所使用的shell
[root@wzp
~]# ls -l test1

-rw-r--r-- 1 root root 21 01-27 15:30 test1

[root@wzp ~]# ./test1

bash: ./test1: 权限不够
如果直接运行该文件是无法执行的,因为shell脚本文件所在目录没添加到PATH环境变量中,我们可以通过echo
$PATH查看。这里我们可以使用单点操作符。
[root@wzp
~]# chmod u+x test1

[root@wzp ~]# ./test1

2011年 01月 27日 星期四 15:32:23 CST

root    
:0          
2010-12-13 09:29

root    
pts/0       
2011-01-27 15:12 (:0.0)
3、显示消息
[root@wzp
~]# echo welcome to 24 blog

welcome to 24 blog
如上正常显示
[root@wzp
~]# echo welcome to 24' blog


如上字符出现单引号,则无法显示
[root@wzp
~]# echo "welcome to 24' blog"

welcome to 24' blog
通过外围添加双引号使得正常显示
[root@wzp
~]# echo 'welcome to "51cto" website'

welcome to "51cto" website
所以说在shell脚本中需要用到echo显示消息时注意单引号和双引号问题。
[root@wzp
~]# cat test1

#!/bin/bash

echo -n "today is : "

date

echo "who logined this os :"

who
上面使用-n 参数可以使得echo命令结果和文本字符串在同一行
[root@wzp
~]# ./test1

today is : 2011年 01月 27日 星期四 15:49:08 CST

who logined this os :

root    
:0          
2010-12-13 09:29

root    
pts/0       
2011-01-27 15:12 (:0.0)
4、使用变量

4.1 环境变量

可以通过set命令显示活动环境变量的完整列表,如下通过echo单独显示一些$开头的变量:
[root@wzp
~]# echo $LANG

zh_CN.UTF-8

[root@wzp ~]# echo $USER

root

[root@wzp ~]# echo $LANG

zh_CN.UTF-8

[root@wzp ~]# echo $UID

0

[root@wzp ~]# echo $HOME

/root
如上可以看到我用的是root账号,还有字符编码类型,家目录
[root@wzp
~]# cat test1

#!/bin/bash

echo user info for userid: $USER

echo UID: $UID

echo HOME DIR : $HOME

echo LANG : $LANG

[root@wzp ~]# ./test1

user info for userid: root

UID: 0

HOME DIR : /root

LANG : zh_CN.UTF-8
如上可以总结出:使用美元符号开头的环境变量可以从脚本中引进这些环境变量

但是,当我们只想要使用$符号的时候呢?怎么显示:
[root@wzp
~]# echo $HOME

/root

[root@wzp ~]# echo /$HOME

//root

[root@wzp ~]# echo \$HOME

$HOME
上面的例子可以看出使用\反斜杠,那么shell脚本则将美元符号翻译成$,而不再是一个变量了,这点容易懂!

4.2用户变量

shell允许在脚本中设置和使用自己的变量,用户变量区分大小写,通过等号赋值给用户变量(=两边不准有空格)跟系统变量一样,用户变量也可以使用$引用:
[root@wzp
~]# cat test1

#!/bin/bash

days=10

xxx1=ftp

echo $xxx1 is 文件传输协议

xxx2=http

echo $xxx2 is 超文本标记传输协议

[root@wzp ~]# ./test1

ftp is 文件传输协议

http is 超文本标记传输协议
4.3反引号

`这个符号就是反引号,在shell脚本之外很少使用它(处于键盘的1号键左边)反引号允许将shell命令的输出赋值给变量,在脚本编程中,它是主要的构建。如下例:
[root@wzp
~]# cat test1

#!/bin/bash

testing=`date`

echo the date and the time are : $testing

[root@wzp ~]# ./test1

the date and the time are : 2011年 01月 27日 星期四 20:13:17
CST
如果上例没有使用反引号,那么现实的内容就是date这个字符而已了!

再来一个现实比较常用的例子:
[root@wzp
~]# cat test1

#!/bin/bash

testing=`date +%y%m%d`

ls /usr/bin -al > log.$testing
如上date
+%y%m%d表示显示date命令的年月日,然后把$testing变量的值作为文件名,并且把/usr/bin下的文件目录都重定向到生产的文件中。(重定向下面会讲述)
[root@wzp
~]# ./test1

[root@wzp ~]# ll
log.110127

-rw-r--r-- 1 root root 97764 01-27 20:18 log.110127
这样就很方便了,每天的日志文件自动区分出来,实现自动化!

5、重定向输入输出

有时候想通过命令保存输出,而不是显示在屏幕上,重定向就可以解决这个问题。

5.1、输出重定向

意思是说通过一条命令把显示的内容发送到文件中,通过>大于号实现,例子:
[root@wzp
~]# date >
test1

[root@wzp ~]# cat test1

2011年 01月 27日 星期四 20:26:08 CST

[root@wzp ~]# who >
test1

[root@wzp ~]# cat test1

root    
:0          
2011-01-27 20:07

root    
pts/0       
2011-01-27 20:10 (:0.0)
这个好理解,不多说。

5.2、输入重定向

输入重定向是输出重定向的相反过程,把一个文件的内容重定向到一个命令中,如:
[root@wzp
~]# cat test1

2011年 01月 27日 星期四 20:29:15 CST

[root@wzp ~]# wc <
test1

1  6 43
通过将文本文件重定向到wc命令中,可以算出这个文件的行数、单词数、字节数。

如上表示test1文件有1行、6个单词和43个字节,这个很好懂吧!

5.3追加

重定向的作用是完全覆盖,追加的概念就是在原本文件内容基础上添加,如:
[root@wzp
~]# cat test1

2011年 01月 27日 星期四 20:29:15 CST

[root@wzp ~]# cal >>
test1

[root@wzp ~]# cat test1

2011年 01月 27日 星期四 20:29:15 CST

一月
2011

日 一 二 三 四 五 六

1

2  3 
4  5  6 
7  8

9 10 11 12 13 14 15

16 17 18 19 20 21 22

23 24 25 26 27 28 29

30 31
通过>>符号实现追加,可以看到date显示的内容还是没丢失。

6、管道

通过|这个符号实现管道过滤作用,这个很容易理解,比如在查看一些服务或者开放的端口,就可以通过管道过滤出我们想到查看的东西,而不是全部显示出来!
[root@wzp
~]# rpm -qa |grep http

httpd-2.2.3-22.el5

httpd-manual-2.2.3-22.el5

httpd-devel-2.2.3-22.el5

[root@wzp ~]# netstat -antup |grep http

tcp       
0     
0
:::80                      
:::*                       
L:ISTEN     
4124/httpd

tcp       
0     
0
:::443                     
:::*                       
LISTEN     
4124/httpd   
这个就不多说了!

7、数学计算

处理数学的能力是编程语言至关重要的,可惜shell这方面不是很好。简单说说~

7.1、expr命令

expr命令可以处理命令行中的等式,在RHEL5.3下:
[root@wzp
~]# expr 2*5

2*5

[root@wzp ~]# expr 2 * 5

expr: 语法错误

[root@wzp ~]# expr 2 \* 5

10
这样子在shell命令中使用expr命令就显得麻烦了。

如下通过使用括号改进这个措施.

7.2使用括号

看下面这个例子,完全就是可以通过[]或者()替代了expr
[root@wzp
~]# wzp1=$[1+5]

[root@wzp ~]# echo $wzp1

6
先赋值,然后显示变量值。继续看看一个例子:
[root@wzp
~]# cat test1

#!/bin/bash

var1=100

var2=50

var3=45

var4=$[$var1 * ($var2 - $var3)]

echo the final result is $var4

[root@wzp ~]# ./test1

the final result is 500
通过[()]非常灵活的解决数学计算问题。当然,bash shell只是解决了整数运算。

对于浮点算术运算,出现小数点的情况又是如何呢?

7.3浮点解决方案

首先看看一个例子:
[root@wzp
~]# cat test1

#!/bin/bash

var1=100

var2=45

var3=$[$var1 / $var2]

echo the final result is $var3

[root@wzp ~]# ./test1

the final result is 2
我们可以看到,计算结果余数被忽略了,只是留下商。

shell脚本可以通过使用Z shell(zsh)解决浮点算术运算,当然bash
shell可以通过使用内置的bash计算器(称为bc)解决浮点运算问题。

这里长话短说,直接在脚本用使用bc,具体要用到的时候在找解决方法。

先看下面一个例子:
[root@wzp
~]# cat test1

#!/bin/bash

var1=100

var2=45

var3='echo "scale=4; $var1 / $var2" | bc'

echo the answer is $var3

[root@wzp ~]# sh test1

the answer is echo "scale=4; $var1 / $var2" | bc
不知道为何,参加资料可以实现,我这里一直搞不定!先放着!!

自己猜测应该是linux发行版问题~~~

8、退出脚本

每条运行在shell中的命令都使用一个退出状态,不过这点比较少弄,这个退出状态时一个介于0到255之间的数据,这个稍微了解下就行了!

8.1、核对退出状态

linux提供了 $? 这个特殊变量来保存最后一条命令执行结束的退出状态

先看个例子:
[root@wzp
~]# date

2011年 01月 27日 星期四 22:39:58 CST

[root@wzp ~]# echo $?

0

[root@wzp ~]# wzp

bash: wzp: command not found

[root@wzp ~]# echo $?

127
从上面看到date这个有效命令的退出状态值是0,而wzp这个无效命令的值是127

具体还有其他退出状态值的数,可以自行参考下linux退出状态代码

8.2退出命令

在shell文本脚本中,可以自行设置退出状态值
[root@wzp
~]# cat test1

#!/bin/bash

date

exit 5

[root@wzp ~]# ./test1

2011年 01月 27日 星期四 23:13:42 CST

[root@wzp ~]# echo $?

5
这个效果具体作用后续用到再说说了,这里点到为止了!

本文出自 “twenty_four
博客,请务必保留此出处http://twentyfour.blog.51cto.com/945260/505644

下面是我个人跟这代码:

bash&nbsp;shell笔记1&nbsp;脚本基础知识的更多相关文章

  1. bash&nbsp;shell笔记6&nbsp;脚本控制

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/522415 知 ...

  2. 什么是Shell?Shell脚本基础知识详细介绍

    这篇文章主要介绍了什么是Shell?Shell脚本基础知识介绍,本文是一篇Shell脚本入门文章,在本文你可学到什么是Shell.有多少种Shell.一个Shell脚本代码实例,需要的朋友可以参考下 ...

  3. Spring Cloud微服务实战阅读笔记(一) 基础知识

    本文系<Spring Cloud微服务实战>作者:翟永超,一书的阅读笔记. 一:基础知识   1:什么是微服务架构     是一种架构设计风格,主旨是将一个原本独立的系统拆分成多个小型服务 ...

  4. shell脚本基础知识以及变量

    一.基础知识 1.shell脚本的格式注意事项 第一行(一般必须写明):指定脚本使用的shell(若不写明也不影响脚本的执行,系统会自动以sh解析脚本)."#!/bin/bash" ...

  5. shell 脚本基础知识详细介绍(二)

    SimonSu 博客 评论墙 读者墙 链接 关于 linux中的sh脚本语法 玩linux都知道sh脚本的方便,但如何编写sh脚本却是像我这样的新手和菜鸟的难题.能不能编写得出来是一回事,了不了解又是 ...

  6. Shell脚本基础知识详细介绍(一)

    Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种 ...

  7. 《UNIX环境高级编程》(APUE) 笔记第一章 - UNIX基础知识

    1 - UNIX基础知识 Github 地址 1. 操作系统 可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.通常将这种软件称为 内核 (kernel) .( Linux 是 GN ...

  8. Java基础知识强化之多线程笔记01:多线程基础知识(详见Android(java)笔记61~76)

    1. 基础知识: Android(java)学习笔记61:多线程程序的引入    ~    Android(java)学习笔记76:多线程-定时器概述和使用 

  9. 大数据学习笔记——Java篇之基础知识

    Java / 计算机基础知识整理 在进行知识梳理同时也是个人的第一篇技术博客之前,首先祝贺一下,经历了一年左右的学习,从完完全全的计算机小白,现在终于可以做一些产出了!可以说也是颇为感慨,个人认为,学 ...

随机推荐

  1. 2017.11.18 IAP下载(STM8,PIC,STM32)

    客户要求用IAP下载,mark一下,客户还给了stm32的引导码.仅供参考. 1 PIC单片机的IAP  2 STm32 IAP https://www.cnblogs.com/WeyneChen/p ...

  2. 【tensorflow:Google】三、tensorflow入门

    [一]计算图模型 节点是计算,边是数据流, a = tf.constant( [1., 2.] )定义的是节点,节点有属性 a.graph 取得默认计算图 g1 = tf.get_default_gr ...

  3. 如何在PostgreSQL中建只读账号

    转: 如何在PostgreSQL中建只读账号 Posted on 2014-01-21 22:00:15 by osdba 在PostgreSQL中并没有CREATE TABLE权限名称,这是与其它数 ...

  4. Arcgis for javascript map操作addLayer详解

    本节的内容很简单,说说Arcgis for Javascript里面map对象的addLayer方法.在for JS的API中,addLayer方法有两种,如下图: addLayer方法 在addLa ...

  5. 行为驱动开发BDD概要

    BDD脱胎于TDD 行为驱动开发(Behavior-Driven Development,简称BDD),是在测试驱动开发(Test-Driven Development,TDD)基础上发展而来的一种软 ...

  6. SlowHTTPTest-慢速DoS攻击

    Slowhttptest是一个依赖于实际HTTP协议的Slow HTTP DoS攻击工具,它的设计原理是要求服务器所有请求被完全接收后再进行处理. SlowHTTPTest是一款对服务器进行慢攻击的测 ...

  7. 9.链表中倒数第k个结点[FindReverseKthLinkedListNode]

    [题目] 输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下:  C++ Code  12345   struct ListNode {     int ...

  8. The Pragmatic Programmer 摘要评注

    这本书与其说是一本编程书,倒不如说是一本教做人的书.很多时候项目的进行依赖于技术以外的因素,比如说沟通,人的品格,人际,处理问题的方法.在未来的一度日子会陆续添加个人认为值得学习的内容.

  9. 简述Java面向对象三大特征:封装、继承、多态

    封装: 把对象的全部属性和服务结合在一起,形成不可分割的独立单位: 尽可能隐藏内部细节.(数据隐藏.隐藏具体实现的细节)     public.private.protected.default pu ...

  10. 设计模式之桥接(bridge)模式

    在现实生活中,我们常常会用到两种或多种类型的笔,比如毛笔和蜡笔.假设我们需要大.中.小三种类型的画笔来绘制12中不同的颜色,如果我们使用蜡笔,需要准备3*12=36支.但如果使用毛笔的话,只需要提供3 ...