实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
引言
SHELL在处理一些问题的时候有得天独厚的优势,快捷方便,学会了还可以显摆显摆,当然了,shell的语法有点坑爹,没有系统的学过,只能一点一点的积累。
今天这个是在实现一个刷新数据库数据的脚本的时候碰到的一些知识点,刷新的时候用到了正则匹配、数学运算、比较等等。
shell中的数组
数组的定义
arr=(1 2 3 4 5) arr=(燕睿涛 yrt lulu yanruitao) arr=('^[0-9]+$' '^yrt\.(\d+)\.log$') arr=( "燕睿涛" \ "yanruitao" \ "today is a good day!" )
数组的使用
len=${#arr[@]} #返回的是数组元素的个数 echo ${arr[0]} #数组中的第一个元素,这个和其他语言的数组类似,下表从0开始 echo ${arr[2]} #数组中的第3个元素
实际的例子
[yanruitao@boss_runtime sh]$ arr=( > "燕睿涛" > "http:\/\/www\.baidu\.com\/(\d+)\.html" > "yanruitao" > "lulu" > "yrt" > ) [yanruitao@boss_runtime sh]$ echo ${#arr[@]} 5 [yanruitao@boss_runtime sh]$ echo ${arr[1]} http:\/\/www\.baidu\.com\/(\d+)\.html [yanruitao@boss_runtime sh]$ echo ${arr[0]} 燕睿涛 [yanruitao@boss_runtime sh]$ echo ${arr[5]} [yanruitao@boss_runtime sh]$
shell中的大小比较
#第一种(()) if((6 <8)); then echo "yes 燕睿涛"; fi #输出——yes 燕睿涛 if(($a>8)); then echo "yes 燕睿涛"; fi if(($a<=$b)); then echo "yes 燕睿涛"; fi #第二种[] [[]] if [ 2 -gt 1 ]; then echo "iforever 燕睿涛"; fi if [[ 'abc' > 'ab' ]]; then echo "iforever 燕睿涛"; fi #iforever 燕睿涛 if [[ 2 < 10 ]]; then echo "iforever 燕睿涛"; fi #无输出 if [[ 2 -lt 10 ]]; then echo "iforever 燕睿涛"; fi #iforever 燕睿涛
可以看到上面这几种还是有些规律的:
双小括号[(())]里面是可以直接使用大于小于号进行比较(>、<、<=、>=),而且不需要“坑爹”的空格,用于数学计算
单中括号([])里面比较必须使用-gt、-lt、-ne、-eq这些运算符,而且必须要有严格的空格要求
双中括号([[]])里面比较可以使用>、<、-gt、-lt......这两种格式,但是还是必须要有严格的空格要求,而且双中括号中的>、<对类似于字符串的比较,所以在使用的时候需要注意
shell中的括号
#看看小括号的用法,首先是在for循环里面,相当于还是数学计算 [yanruitao@boss_runtime ad]$ for((a=0;a<10;a++)) > do > echo $a > done 0 1 2 3 4 5 6 7 8 9 #对变量进行++,还是相当于数序运算 [yanruitao@boss_runtime ad]$ i=1 [yanruitao@boss_runtime ad]$ echo $i 1 [yanruitao@boss_runtime ad]$ let i++ [yanruitao@boss_runtime ad]$ echo $i 2 [yanruitao@boss_runtime ad]$ ((i++)) [yanruitao@boss_runtime ad]$ echo $i 3 #数学运算 [yanruitao@boss_runtime ad]$ echo 1+2 1+2 [yanruitao@boss_runtime ad]$ echo $((1+2)) 3 #单括号里面是一个命令组,括号中的命令将会新开一个shell顺序执行,所以这个里面相当于一个封闭的空间,里面的变量什么的不能被剩余代码使用 [yanruitao@boss_runtime ad]$ a=1 [yanruitao@boss_runtime ad]$ (a=3;echo $a) 3 [yanruitao@boss_runtime ad]$ echo $a 1 #括号中and的使用 if [[ -n "$ret" && $ret -gt 123 ]]... #[[]]双中括号中只能使用&&,不能使用-a if [ -n "$ret" -a $ret -gt 123 ]... #[]单中括号中只能使用-a,不能使用&& if(($ret)) && (($ret >123 ))... #(())双小括号使用&&
shell中函数的定义
function getId() { local url=$1 #local限定了变量url的作用域只在函数里面,不然会污染全局的作用域 ereg="http:\/\/www\.baidu\.com\/\([0-9]\+\)\.html" local ret=$(expr $url : $ereg) if [[ -n "$ret" && $ret -gt 0 ]]; then #当ret为null时使用[]会报错,-n这里的双引号一定要加上,不然当$ret为null时,一直返回真 echo $ret return 0 fi return 1 } [yanruitao@boss_runtime sh]$ echo $? 0 [yanruitao@boss_runtime sh]$ getId "http://www.baidu.com/123.htl" [yanruitao@boss_runtime sh]$ echo $? 1 [yanruitao@boss_runtime sh]$ getId "http://www.baidu.com/123.html" 123 [yanruitao@boss_runtime sh]$ echo $? 0
函数的整体形式如上面的例子,这里面注意两点:
首先就是返回值,通过return的返回值只能是整数,并且在调用完成之后使用echo $?可以查看返回值。
要使用赋值的形式需要有echo,就像ret=$(getId "http://www.baidu.com.1234.html"),只有echo的值会传递给ret变量。
杂项知识点
字符串转数组
[yanruitao@boss_runtime sh]$ str="燕睿涛 lulu yrt yanruitao" [yanruitao@boss_runtime sh]$ arr=($str) #这一步将字符串转化为了数组 [yanruitao@boss_runtime sh]$ echo ${arr[*]} 燕睿涛 lulu yrt yanruitao [yanruitao@boss_runtime sh]$ echo ${#arr[@]} 4
常用判断标志
[ -z STRING ] “STRING” 的长度为零则为真。
[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -a FILE ] 如果 FILE 存在则为真。
linux后台运行相关
& #在一个命令的最后加上这个命令,可以将该命令放到后台执行 ./update.sh 100 500 & ctrl + z #讲一个正在前台执行的命令放到后台,并且处于暂停状态 jobs #查看当前后台运行的命令 jobs -l #可以显示所有后台任务的PID [yanruitao@boss_runtime sh]$ jobs -l [1] 9681 Running ./t.sh 100 300 & [2] 9683 Running ./t.sh 100 300 & [3]- 9685 Running ./t.sh 100 300 & [4]+ 9688 Running ./t.sh 100 300 & fg #把后台中的命令调至前台继续运行,如果后台有多个命令可以使用`fg %jobnumber`将选中命令调出 [yanruitao@boss_runtime sh]$ jobs -l [2] 10033 Running ./t.sh 100 300 & [3] 10035 Running ./t.sh 100 300 & [4]- 10037 Running ./t.sh 100 300 & [5]+ 10039 Running ./t.sh 100 300 & [yanruitao@boss_runtime sh]$ fg %2 ./t.sh 100 300 bg #讲一个在后台暂停的命令变成在后台继续执行。同样,如果有多个命令,可以使用bg %jobnumber [yanruitao@boss_runtime sh]$ jobs -l [1]- 11655 Running ./t.sh 100 300 & [2]+ 11662 Running ./t.sh 100 300 & [yanruitao@boss_runtime sh]$ fg %1 ./t.sh 100 300 ^Z [1]+ Stopped ./t.sh 100 300 [yanruitao@boss_runtime sh]$ jobs -l [1]+ 11655 Stopped ./t.sh 100 300 [2]- 11662 Running ./t.sh 100 300 & [yanruitao@boss_runtime sh]$ bg %1 [1]+ ./t.sh 100 300 & [yanruitao@boss_runtime sh]$ jobs -l [1]- 11655 Running ./t.sh 100 300 & [2]+ 11662 Running ./t.sh 100 300 & kill #终止进程 kill %num #通过jobs查看的job号,进行杀死 kill pid #通过进程号杀掉进程 ctrl + C #终止当前前台的进程
以上所述就是本文的全部内容了,希望能够对大家熟悉Linux shell命令有所帮助。
本文向大家介绍Mysql基础知识点汇总,包括了Mysql基础知识点汇总的使用技巧和注意事项,需要的朋友参考一下 1.什么是SQL语句 sql语言:结构化的查询语言。(Structured Query Language),是关系数据库管理系统的标准语言。 它是一种解释语言:写一句执行一句,不需要整体编译执行。 语法特点: 1.没有“ ”,字符串使用‘ '包含 2.没有逻辑相等,赋值和逻辑相等都是=
Java 相关知识点汇总,包括 Java 基础、Java 容器、Java 并发、JVM、编程规范、数据结构与算法、数据库、系统设计、设计模式、数据通信、网站架构、备战面试、Github 榜单。
本文向大家介绍js+jquery常用知识点汇总,包括了js+jquery常用知识点汇总的使用技巧和注意事项,需要的朋友参考一下 一、jquery源码中常见的知识点 1.string,number类型转换的快捷方法 分享一个面试例子: //加会将其后面自动转换成字符串 "64"+4="644" //减会将其自动转换成数字 "64"-4=60 2.bool类型转换 !!obj,将其强制
本文向大家介绍JSON相关知识汇总,包括了JSON相关知识汇总的使用技巧和注意事项,需要的朋友参考一下 JSON:JavaScript 对象表示法(JavaScript Object Notation) JSON 语法规则 数据在名称/值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON有6种类型的值: 对象、数组、字符串、数字、布尔值、null JSON对象是一个
本文向大家介绍Node.js 的模块知识汇总,包括了Node.js 的模块知识汇总的使用技巧和注意事项,需要的朋友参考一下 在写 Node.js 应用程序的时候,你确实可以把所有代码放在巨大原 index.js 文件中,不在乎你的应用程序会变得多大多复杂。Node.js 解释器不会在意这个事情。但在代码组织方面,你很快就会陷入混乱,不能理解代码,而且难以调试。所以,作为一个人,你应该关心代码的结构
本文向大家介绍Java内部类知识汇总,包括了Java内部类知识汇总的使用技巧和注意事项,需要的朋友参考一下 Java内部类 一、 含义 在Java编程语言里,程序是由类(class)构建而成的。在一个类的内部也可以声明类,我们把这样的类叫做内部类。 二、 作用 •实现了更好的封装,我们知道,普通类(非内部类)的访问修饰符不能为private或protected,而内部类可以。当我们将内部类声明