- 浏览: 2183049 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
前面散仙已经把Linux基础的shell命令系列的博客完工,如果没有任何linux基础的朋友,建议先从shell命令开始学习,如果有一定基础的就可以直接跳过。从本篇起,散仙要写的是关于shell编程系列的知识。
前面我们例子里面的命令,基本都是单个执行的,但是在linux下,只有把命令组合成一个脚本,发挥的作用,才是巨大的,这就类似于一个砖头没啥用处,但是用很多砖头,我们就可以盖一座大厦,这样它们的价值就体现出来了。
在linux中我们可以使用分号分开执行2个命令:
我们也可以放脚本里执行,编写一个shell脚本的头部生命通常是#!/bin/bash开头,除了这个开头的其他的#开头都是注释内容:
vi test.sh编辑一个脚本
两种调用方法,没有权限,可以赋值权限:
如何输出一行文本,类似于JAVA里面的System.out.println()功能,linux里面的echo提供了这个功能,
如果字符串里面出现双引号,就使用单引号括起来,如果出现了单引号,就用双引号括起来,如果即出现了单引号,也出现了双引号,那么就要用\转义:
echo -n 参数可以避免末尾换行,类似System.out.print()
echo支持在字符串中,使用linux环境变量,可以正确输出:
用户变量定义通过等号赋值,注意等号左右不能有空格,变量名区分大小写
变量之间的赋值:
把一个shell命令赋值给一个变量,使用反引号:
反引号的功能,类似于JavaScript里面的eval关键字的功能,可以解析字符串命令
通过这样,我们就可以生成文件时,以时间命名:
输出重定向命令:
>覆盖模式重定向
>>追加模式重定向
输入重定向命令
<
内联输入重定向
<<
输出重定向相信大家用的很多,输入的重定向可能用的不多,下面散仙举几个例子:
输出重定向,可以把一个文件的内容,发送给命令进行统计
这三个数字的含义,代表文本的行数,词数,和字节大小,说明,有8行,5个单词,65字节
内联重定向,允许交互式的读入,在你定义好的开头,与结束符之间,追加统计进行统计:
结束符可以随便定义,散仙在这里是B
下面要说的是管道命令:|
rpm -qa可以查询已经安装的软件包,然后重定向到sort命令进行排序。
重定向命令可以使用多个:
接下来,我们看下如何在shell中,执行数学运算:
expr 后面跟一个表达式,注意运算式左右必须有一个空格
这是比较传统的用法,linux里面可以有计算器bc模块,如果你的linux系统里面没有,就使用yum install bc命令安装一个
默认的是不保留小数的,我们可以通过scale设置小数点位。
最后使用quit命令退出程序。
下面我们看看如何在脚本中,使用bc命令:
我们还可以结合,内联重定向使用bc计算器,在脚本里
下面我们看下退出脚本的状态码:
使用变量$?
1,0代表成功
2,1代表通用的未知错误
3,126代表命令不可执行
4,127代表没找到命令
5,128无效的退出参数
6,128+xlinux信号x的严重错误
7,130代表命令通过Ctrl+C终止
8,255退出状态码越界
在JAVA编程中,我们都知道使用System.exit可以终止虚拟机运行,那么在linux中,我们也有一样的终止方法类似于JAVA中的return关键字exit;
当然我们也可以执行返回的状态码:
状态码最大是255,超过255的,一律会被取模值,这一点需要注意、
前面我们例子里面的命令,基本都是单个执行的,但是在linux下,只有把命令组合成一个脚本,发挥的作用,才是巨大的,这就类似于一个砖头没啥用处,但是用很多砖头,我们就可以盖一座大厦,这样它们的价值就体现出来了。
在linux中我们可以使用分号分开执行2个命令:
[root@h1 ~]# who ;date root pts/0 2014-08-08 02:55 (192.168.46.22) 2014年 08月 08日 星期五 03:39:43 CST [root@h1 ~]#
我们也可以放脚本里执行,编写一个shell脚本的头部生命通常是#!/bin/bash开头,除了这个开头的其他的#开头都是注释内容:
vi test.sh编辑一个脚本
#!/bin/bash #我是注释的内容 date who
[root@h1 ~]# sh test.sh 2014年 08月 08日 星期五 03:46:15 CST root pts/0 2014-08-08 02:55 (192.168.46.22) [root@h1 ~]#
两种调用方法,没有权限,可以赋值权限:
[root@h1 ~]# sh test.sh 2014年 08月 08日 星期五 03:46:15 CST root pts/0 2014-08-08 02:55 (192.168.46.22) [root@h1 ~]# ./test.s -bash: ./test.s: 没有那个文件或目录 [root@h1 ~]# ./test.sh -bash: ./test.sh: 权限不够 [root@h1 ~]# chmod u+x test.sh [root@h1 ~]# ll 总用量 328476 -rw-r--r-- 1 root root 143775368 7月 28 19:30 abc1.txt -rw-------. 1 root root 1087 6月 13 19:06 anaconda-ks.cfg -rw-r--r-- 1 root root 52 7月 31 21:29 count2.txt -rw-r--r-- 1 root root 52 7月 31 19:46 count.txt -rw-r--r--. 1 root root 96183833 6月 9 17:27 hadoop-2.2.0.tar.gz -rw-r--r-- 1 root root 1 7月 31 21:25 hh.txt drwxr-xr-x 3 root root 4096 7月 29 04:47 hivesrc -rw-r--r--. 1 root root 2111 6月 16 13:10 initserver.sh -rw-r--r--. 1 root root 7995 6月 13 19:06 install.log -rw-r--r--. 1 root root 3384 6月 13 19:06 install.log.syslog drwxr-xr-x 2 root root 4096 7月 31 21:19 intest lrwxrwxrwx 1 root root 12 7月 31 21:45 jdk -> jdk1.7.0_25/ drwxr-xr-x. 8 search 143 4096 6月 6 2013 jdk1.7.0_25 -rwx------. 1 root root 96316511 11月 20 2013 jdk-7u25-linux-x64.gz drwxr-xr-x 3 root root 4096 7月 31 21:33 li drwxr-xr-x 3 root root 4096 7月 9 04:08 lo drwxr-xr-x 3 root root 4096 7月 9 04:08 login -rw-r--r-- 1 root root 1048 6月 19 03:31 setlimit.sh drwxr-xr-x 2 root root 4096 8月 5 01:44 test drwxr-sr-x 2 root abc 4096 8月 6 01:53 testidr -rwxr--r-- 1 root root 46 8月 8 03:43 test.sh drwxr-xr-x 3 root root 4096 6月 20 02:51 tsethadoop [root@h1 ~]# ./test.sh 2014年 08月 08日 星期五 03:47:10 CST root pts/0
如何输出一行文本,类似于JAVA里面的System.out.println()功能,linux里面的echo提供了这个功能,
如果字符串里面出现双引号,就使用单引号括起来,如果出现了单引号,就用双引号括起来,如果即出现了单引号,也出现了双引号,那么就要用\转义:
[root@h1 ~]# echo "a's dog" a's dog [root@h1 ~]# echo "a's"" dog" a's dog [root@h1 ~]# echo "a's"abc" dog" a'sabc dog [root@h1 ~]# echo "a's\"abc\" dog" a's"abc" dog [root@h1 ~]# echo 'a 'dog' "abc"' a dog "abc"
echo -n 参数可以避免末尾换行,类似System.out.print()
echo -n "conent:" date
[root@h1 ~]# sh a.sh conent:2014年 08月 08日 星期五 04:00:14 CST
echo支持在字符串中,使用linux环境变量,可以正确输出:
[root@h1 ~]# echo "my home is $HOME" my home is /root [root@h1 ~]#
用户变量定义通过等号赋值,注意等号左右不能有空格,变量名区分大小写
[root@h1 ~]# more a.sh name="我是三劫散仙" echo "info: $name" [root@h1 ~]# sh a.sh info: 我是三劫散仙 [root@h1 ~]#
变量之间的赋值:
[root@h1 ~]# more a.sh name="我是三劫散仙" name2=$name echo "info: $name2" [root@h1 ~]# sh a.sh info: 我是三劫散仙 [root@h1 ~]#
把一个shell命令赋值给一个变量,使用反引号:
[root@h1 ~]# more b.sh test=`date;who` echo -n "输出的内容是什么呢,大家来看下:" echo $test [root@h1 ~]# sh b.sh 输出的内容是什么呢,大家来看下:2014年 08月 08日 星期五 04:14:37 CST root pts/0 2014-08-08 02:55 (192.168.46.22) [root@h1 ~]#
反引号的功能,类似于JavaScript里面的eval关键字的功能,可以解析字符串命令
通过这样,我们就可以生成文件时,以时间命名:
[root@h1 ~]# more c.sh #注意date后面有空格隔开,否则会出错 filename=`date +%y%m%d` echo "我是文件里的内容" > log.$filename [root@h1 ~]# more log.140808 我是文件里的内容 [root@h1 ~]#
输出重定向命令:
>覆盖模式重定向
>>追加模式重定向
输入重定向命令
<
内联输入重定向
<<
输出重定向相信大家用的很多,输入的重定向可能用的不多,下面散仙举几个例子:
[root@h1 ~]# wc < a.sh 8 5 65 [root@h1 ~]#
输出重定向,可以把一个文件的内容,发送给命令进行统计
这三个数字的含义,代表文本的行数,词数,和字节大小,说明,有8行,5个单词,65字节
内联重定向,允许交互式的读入,在你定义好的开头,与结束符之间,追加统计进行统计:
[root@h1 ~]# wc << B > a b 1 > d c 2 > B 2 6 12 [root@h1 ~]#
结束符可以随便定义,散仙在这里是B
下面要说的是管道命令:|
[root@h1 ~]# rpm -qa | sort acl-2.2.49-6.el6.x86_64 attr-2.4.44-7.el6.x86_64 audit-2.2-2.el6.x86_64 audit-libs-2.2-2.el6.x86_64 authconfig-6.1.12-13.el6.x86_64 b43-openfwwf-5.2-4.el6.noarch basesystem-10.0-4.el6.noarch bash-4.1.2-15.el6_4.x86_64 binutils-2.20.51.0.2-5.36.el6.x86_64 bridge-utils-1.2-10.el6.x86_64 bzip2-1.0.5-7.el6_0.x86_64 bzip2-libs-1.0.5-7.el6_0.x86_64 ca-certificates-2013.1.94-65.0.el6.noarch centos-release-6-5.el6.centos.11.1.x86_64 checkpolicy-2.0.22-1.el6.x86_64 chkconfig-1.3.49.3-2.el6_4.1.x86_64 coreutils-8.4-31.el6.x86_64 coreutils-libs-8.4-31.el6.x86_64 cpio-2.10-11.el6_3.x86_64
rpm -qa可以查询已经安装的软件包,然后重定向到sort命令进行排序。
重定向命令可以使用多个:
[root@h1 ~]# ll | more | sort drwxr-sr-x 2 root abc 4096 8月 6 01:53 testidr drwxr-xr-x 2 root root 4096 7月 31 21:19 intest drwxr-xr-x 2 root root 4096 8月 5 01:44 test drwxr-xr-x 3 root root 4096 6月 20 02:51 tsethadoop drwxr-xr-x 3 root root 4096 7月 29 04:47 hivesrc drwxr-xr-x 3 root root 4096 7月 31 21:33 li drwxr-xr-x 3 root root 4096 7月 9 04:08 lo drwxr-xr-x 3 root root 4096 7月 9 04:08 login drwxr-xr-x. 8 search 143 4096 6月 6 2013 jdk1.7.0_25 lrwxrwxrwx 1 root root 12 7月 31 21:45 jdk -> jdk1.7.0_25/ -rw-------. 1 root root 1087 6月 13 19:06 anaconda-ks.cfg -rw-r--r-- 1 root root 1048 6月 19 03:31 setlimit.sh -rw-r--r-- 1 root root 127 8月 8 04:20 c.sh -rw-r--r-- 1 root root 143775368 7月 28 19:30 abc1.txt -rw-r--r-- 1 root root 1 7月 31 21:25 hh.txt -rw-r--r--. 1 root root 2111 6月 16 13:10 initserver.sh -rw-r--r-- 1 root root 25 8月 8 04:20 log.140808 -rw-r--r--. 1 root root 3384 6月 13 19:06 install.log.syslog -rw-r--r-- 1 root root 52 7月 31 19:46 count.txt -rw-r--r-- 1 root root 52 7月 31 21:29 count2.txt -rw-r--r-- 1 root root 65 8月 8 04:11 a.sh -rw-r--r--. 1 root root 7995 6月 13 19:06 install.log -rw-r--r-- 1 root root 90 8月 8 04:14 b.sh -rw-r--r--. 1 root root 96183833 6月 9 17:27 hadoop-2.2.0.tar.gz -rwx------. 1 root root 96316511 11月 20 2013 jdk-7u25-linux-x64.gz -rwxr--r-- 1 root root 46 8月 8 03:43 test.sh 总用量 328492 [root@h1 ~]#
接下来,我们看下如何在shell中,执行数学运算:
[root@h1 ~]# expr 1+5 1+5 [root@h1 ~]# expr 1 + 5 6 [root@h1 ~]# expr 1 * 8 expr: 语法错误 [root@h1 ~]# expr 1 \* 8 8 [root@h1 ~]# expr 9 / 3 3 [root@h1 ~]# expr 9 / 5 1 [root@h1 ~]#
expr 后面跟一个表达式,注意运算式左右必须有一个空格
这是比较传统的用法,linux里面可以有计算器bc模块,如果你的linux系统里面没有,就使用yum install bc命令安装一个
[root@h1 ~]# bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 12 * 5.8 69.6 8 * 4 / 2 16 5 / 3 1 5 / 3.0 1 4.44 / 2 2 scale=4 3 / 8 .3750 10 / 11 .9090 scale=2 5 / 2 2.50 10 / 3 3.33
默认的是不保留小数的,我们可以通过scale设置小数点位。
最后使用quit命令退出程序。
下面我们看看如何在脚本中,使用bc命令:
[root@h1 ~]# more bc.sh out=`echo "scale=4; 10 / 3" | bc` echo "输出的内容如下:$out" [root@h1 ~]# sh bc.sh 输出的内容如下:3.3333 [root@h1 ~]#
我们还可以结合,内联重定向使用bc计算器,在脚本里
[root@h1 ~]# more cc.sh var1=10.23 var2=9 var3=1 var4=`bc << EOF scale=4 a1 = ($var1+$var2) b1 = ($var2+$var3) a1 + b1 EOF ` echo "最终的结果是: $var4" [root@h1 ~]# sh cc.sh 最终的结果是: 29.23 [root@h1 ~]#
下面我们看下退出脚本的状态码:
使用变量$?
[root@h1 ~]# date 2014年 08月 08日 星期五 05:16:38 CST [root@h1 ~]# echo $? 0 [root@h1 ~]# dates -bash: dates: command not found [root@h1 ~]# echo $? 127 [root@h1 ~]#
1,0代表成功
2,1代表通用的未知错误
3,126代表命令不可执行
4,127代表没找到命令
5,128无效的退出参数
6,128+xlinux信号x的严重错误
7,130代表命令通过Ctrl+C终止
8,255退出状态码越界
在JAVA编程中,我们都知道使用System.exit可以终止虚拟机运行,那么在linux中,我们也有一样的终止方法类似于JAVA中的return关键字exit;
[root@h1 ~]# more t.sh echo "上面的会打印" sleep 5 exit echo "我会被打印出来么?" [root@h1 ~]# sh t.sh 上面的会打印 [root@h1 ~]# echo $? 0 [root@h1 ~]#
当然我们也可以执行返回的状态码:
[root@h1 ~]# cat t.sh echo "上面的会打印" sleep 5 exit 88 echo "我会被打印出来么?" [root@h1 ~]# sh t.sh 上面的会打印 [root@h1 ~]# echo $? 88 [root@h1 ~]#
状态码最大是255,超过255的,一律会被取模值,这一点需要注意、
发表评论
-
备忘几个有用的shell脚本
2015-04-07 21:59 1508(1)在shell下,操作hadoop目录,批量命名或删除, ... -
shell脚本杂记(五)
2014-09-22 19:48 20261,找出多个文件所占用的磁盘空间 du f1 f2 [roo ... -
shell脚本杂记(四)
2014-09-19 20:03 17141,wget是一个用于文件 ... -
shell自动化部署批量建立用户和批量SSH配置
2014-09-18 18:29 3629在linux下面,shell脚本熟练使用,有时候可以帮助我们解 ... -
shell自动化部署神器expect
2014-09-17 21:08 4696Shell可以实现简单的控制流功能,如:循环、判断等。但是对于 ... -
shell脚本杂记(三)
2014-09-16 19:58 16181,我们先来熟悉下正则表达式一些字符含义的基础 ^行起始标记 ... -
shell脚本杂记(二)
2014-09-15 21:25 20261,求两个文件的交集comm a.txt b.txt -1 - ... -
shell脚本杂记(一)
2014-09-12 21:50 20401,登陆系统时,$代表 ... -
跟散仙学shell编程(十五)
2014-08-27 21:24 1845上篇文章,散仙简单介绍了,如何在Linux下以shell脚本的 ... -
跟散仙学shell编程(十四)
2014-08-26 20:59 1935上篇散仙简单介绍了linu ... -
跟散仙学shell编程(十三)
2014-08-25 20:02 1324上篇散仙主要了讲述了gawk进阶的一些用法,本篇我们来了解下载 ... -
跟散仙学shell编程(十二)
2014-08-22 21:27 1585上篇文章散仙写了关于sed进阶,本篇我们来看下在linux中另 ... -
跟散仙学shell编程(十一)
2014-08-21 21:45 1662上篇散仙写了关于shell里面正则的基础知识,本篇我们来特意学 ... -
跟散仙学shell编程(十)
2014-08-20 21:22 1323上篇文章,散仙简单介绍了在linux中,使用sed和gawk编 ... -
跟散仙学shell编程(九)
2014-08-19 21:49 1713上篇散仙说了如何在linux里面构建更好的交互式shell,本 ... -
跟散仙学shell编程(八)
2014-08-18 21:50 1636上篇散仙说了linux里面函数的使用,本篇我们来看下如何在sh ... -
跟散仙学shell编程(七)
2014-08-15 21:46 1809上篇散仙在文章里描述了如何处理linux信号和脚本控制,本节我 ... -
跟散仙学shell编程(六)
2014-08-14 21:53 2102上篇介绍了linux里面的处理数据的方式,本篇散仙来说下,如何 ... -
跟散仙学shell编程(五)
2014-08-13 21:41 1670上一篇写的是处理用户输入,本篇散仙要写的是linux里面的标准 ... -
跟散仙学shell编程(四)
2014-08-12 21:46 1534上篇介绍了for循环命令 ...
相关推荐
跟老男孩学Linux运维:Shell编程实战 PDF跟老男孩学Linux运维:Shell编程实战 PDF
《跟老男孩学Linux运维:Shell编程实战》分为五大部分:部分为第1章~第4章,此部分着重介绍新手如何学好Shell编程。涉及的内容包括Shell编程的入门介绍、基础知识、运行原理、编程语法、编程习惯、变量知识以及变量...
资深运维架构实战专家及教育培训界*专家十多年的运维实战经验总结,全面系统地讲解运维工作中Shell编程所需的知识点和Shell编程的各种企业级案例。
《LINUX与UNIX Shell编程指南》是一本专为初学者设计的shell编程教程,它深入浅出地介绍了在Linux和UNIX系统中如何使用Shell进行高效自动化任务处理。Shell编程是Linux和UNIX系统中的核心技术,它允许用户通过命令行...
Shell编程是Linux/Unix系统中不可或缺的一部分,它是一种命令行解释器,允许用户与操作系统进行交互,执行系统命令,以及编写脚本自动化任务。在本文中,我们将深入探讨Shell编程的基础知识,包括基本命令、变量、...
Shell 编程中文手册 本手册涵盖了 Shell 编程的基础知识,包括 Shell 概述、Shell 解析器、Shell 脚本入门、Shell 中的变量等。 Shell 概述 Shell 是一种命令行接口,允许用户与操作系统进行交互。学习 Shell ...
《shell编程入门教程》、《shell脚本专家指南》以及《UNIX.shell编程24小时教程》会提供详尽的实例和练习,帮助你巩固所学并深化理解。 总之,Shell编程是Linux/Unix环境中不可或缺的技能,它能够提高工作效率,...
Windows Shell 编程.pdf 看过一些对windows 外壳的扩展程序,在使用上一般都是直接利用windows的外壳API做一些工作,因为外壳操作需要一些比较专业的知识,因此,大部分编程人员特别是使用集成编程环境的程序人员对...
Linux与UNIX Shell编程指南是计算机科学领域中一本经典的指南手册,旨在帮助读者快速掌握Linux与UNIX操作系统下的shell编程技术。下面是从该书中生成的相关知识点: 1. Shell概述 Shell是Linux与UNIX操作系统下的...
shell编程题目练习,练习基本的shell编程,学习脚本语言,提高效率
跟老男孩学Linux运维:Shell编程实战 完整版 pdf
目录网盘文件永久链接 13Linux下Shell编程之While case...25Shell脚本编程综合实战一 26Shell脚本编程综合实战一 27Shell脚本综合实战二 28Shell脚本综合实战二 29Shell编程数组编程及复习 30Shell编程数组编程及复习
《Windows Shell 编程指南与实例》是一本深入探讨Windows操作系统壳层编程技术的专业书籍。在Windows系统中,Shell指的是用户界面,它为用户提供与操作系统交互的环境,包括桌面、开始菜单、快捷方式等。Shell编程则...
Shell 编程.pdf Shell 编程 摘要: 本文结合大量实例阐述如何编写一个shell脚本。 为什么要进行shell编程 在Linux 系统中,虽然有各种各样的图形化接口工具,但是shell仍然是一个非常灵活的工 具。Shell不仅仅是命令...
这是一套完整的Unix培训教材,包括Unix常用命令及SHELL编程基础与高级技巧,PDF格式,共30个文件。另有2个Word文档。包内文件清单如下: 01_Shell-文件安全与权限.PDF 02_Shell-使用find和xargs.PDF 03_Shell-...
shell 编程是 Linux 操作系统中的一个重要组件,它允许用户输入命令并将其执行, shell 编程有两种执行命令的方式:交互式(Interactive)和批处理(Batch)。在 shell 编程中,有变量、流程控制语句等编程语言的...
在IT领域,Linux Shell编程是系统管理员和开发者必备的技能之一。它允许用户通过命令行接口与操作系统进行交互,执行自动化任务,编写脚本,甚至进行复杂的系统管理。本篇文章将深入探讨“Linux Shell编程指南”中...
Shell编程是Linux/Unix操作系统中的一种脚本语言,用于自动化日常任务,交互式地控制操作系统,以及实现系统级别的程序间交互。它提供了命令行接口(CLI)来执行各种系统命令,使用户能够高效地操作文件、目录和系统...