目录

引言

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 #终止当前前台的进程
AWK

awk是强大的文本处理工具。

$awk -F ':' 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $1,"=>",$7;} END{print "[end]user count is ", count}' /etc/passwd
  • 第一点,-F参数指定的是分隔符,对每一分行数据按照他所指定的符号进行分割,默认是空格。
  • BEGIN,读取文件之前(或者数据读入之前),会先执行BEGIN后面中括号里面的内容,可以省略。
  • 接着执行没有名字的中括号{}之间的内容。
  • END,最后执行END后面中括号中的内容,可以省略。
创建目录

很常用的一个操作:

dirname="$(dirname $path)";    //获取目标文件所在的目录
ls "$dirname" 1>/dev/null 2>&1 || mkdir -p "$dirname";
重命名命令

有时有需要将一个很长的命令(拼起来的目录)缩短,这个时候可以使用下面的方法:

shopt -s expand_aliases;    //打开expand_aliases设置,可以进行重命名操作
alias log_echo='echo $1'; //设置log_echo 为echo $1的别名,就可以像函数一样使用log_echo
log_echo 燕睿涛; //输出燕睿涛 log_echo='eval echo $1';
$log_echo 燕睿涛; //输出燕睿涛
动态显示进度条

shell下面安装软件的时候经常会看到那种动态的进度条什么的,感觉很高大上,其实很好实现,用到了tput命令,下面看个例子:

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
tput sc; #保存当前光标位置
tput dl1; #删除光标所在函数数据,dl后面的数字是删除的行数
echo -n "loading $i/10"; #不换行的输出双引号的内容
tput rc; #光标回到上次sc(save cursor position)保存的位置
sleep 2;
done;

看看效果:


参考文献


微信号: love_skills

越努力,越幸运!越幸运,越努力!

做上CEO不是梦

赢取白富美不是梦

屌丝逆袭不是梦

就是现在!!加油

shell知识点小结的更多相关文章

  1. C++重要知识点小结---3

    C++重要知识点小结---1:http://www.cnblogs.com/heyonggang/p/3246631.html C++重要知识点小结---2:http://www.cnblogs.co ...

  2. C++重要知识点小结---2

    C++重要知识点小结--1 :http://www.cnblogs.com/heyonggang/p/3246631.html 1.C++允许程序员声明一个不能有实例对象的类,这样的类惟一的用途是被继 ...

  3. React及Nextjs相关知识点小结

    React及Nextjs知识点小结 函数式组件和类组件区别是什么 1.函数式组件是用于创建无状态的组件,组件不会被实例化,无法访问this中的对象,无法访问生命周期方法,是无副作用的,相比于类组件函数 ...

  4. 【SpringBoot MQ 系列】RabbitMq 核心知识点小结

    [MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...

  5. SpringBoot 系列教程之事务隔离级别知识点小结

    SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上 ...

  6. disruptor笔记之四:事件消费知识点小结

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. promise知识点小结

    断断续续学习es6也有一段时间了,趁着开学空闲对知识点做一些小结. 为什么使用promise 谈到Promise,我们知道,这是社区较理想的异步编程解决方案.想要掌握promise,我们首先要知道其提 ...

  8. Shell学习小结 - 深入认识变量

    移动端访问不佳,请访问我的个人博客 变量的命名 对于初学者来说,可以简单的理解为,变量就是保存在计算机内存中的一系列的键值对. 列如: str="hello" 这里的str就是变量 ...

  9. shell学习小结

    小结 本章我么介绍了怎样使用ls与stat露出文件与文件meta数据,还有怎样使用touch设置未见时间戳.touch可显示有关日期时间相关的信息以及在很多现行系统上的范围限制. 说明了怎样以shel ...

随机推荐

  1. Spring 中classPath:用法

    参考文章地址: http://hi.baidu.com/huahua035/item/ac8a27a994b55bad29ce9d39 http://blog.csdn.net/lushuaiyin/ ...

  2. Database 'xxx' cannot be upgraded because it is read-only or has read-only file Make the database or files writeable, and rerun recovery.

      在分离数据库DatabaseName(暂且用DatabaseName代替该数据库名)后,我将其数据文件以及日志文件移动到新增的磁盘上.然后附加该数据库,结果报如下错误: Database 'Dat ...

  3. MySQL 插入数据时,中文乱码问题的解决(转)

    当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1995-10-08','2015-11-12',' ...

  4. 如何穿越到android底层

    对于android开发,实际上大部分工作都是在应用层,但为了体现"技术含量",以及"知其所以然",以便在遇到问题是不至于束手无策.因此有必要了解底层的工作机制. ...

  5. android android 判断是否滑动

    (转自:http://blog.csdn.net/angle_rupert/article/details/6255522) 声明: float x_temp01 = 0.0f; float y_te ...

  6. android 复制字符串到剪贴板

    public static void CopyToClipboard(Context context,String text){ ClipboardManager clip = (ClipboardM ...

  7. 探索UDP套接字编程

    UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...

  8. 第7章 权限管理(3)_文件系统属性和sudo权限

    3. 文件系统属性chattr权限 (1)chattr命令 命令格式: #chattr [+-=][选项] 文件或目录名 +.-.= 分别表示增加权限.删除权限和赋于某种权限 选项 i:主要用来防止对 ...

  9. bzoj[1087][SCOI2005]互不侵犯King

    Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...

  10. 使用Memberane Moniter监控HTTP & SOAP requests

    Memberane Moniter 使用方法见左侧Documentation 此工具可以监控到每一次发生在指定端口的http请求或者soap请求,如图所示. 但是个人认为仍然有几个问题: 1.不能真正 ...