架构师养成记--37.简单shell编程
一、HelloWord.sh
echo 表示打印,可以在sh文件中写诸如pwd、ls 这样的命令,使用命令的时候尽量使用全路径。
#!/bin/sh
#this is my first sh
echo "this is my first sh"
/bin/pwd
echo
echo "this is files"
/bin/ls
二、Shell应用实例
如果我们想使用Shell脚步,指定个计划任务,比如像每周的周一到周五给管理员发一个消息(比如氮气主机的信息,如内存使用情况,在线人数,磁盘空间等)
#!/bin/sh
/bin/date +%F >> /test/ex2.info
echo "disk info:" >> /test/ex2.info
echo >> /test/ex2.info
/bin/df -h >> /test/ex2.info
echo >> /test/ex2.info
echo "online users:" >> /test/ex2.info
/usr/bin/who | /bin/grep -v root >> /test/ex2.info
echo "Memory info:" >> /test/ex2.info
/usr/bin/free -m >> /test/ex2.info
echo >> /test/ex2.info
#vim root
/usr/bin/write root < /test/ex2.info && /bin/rm /test/ex2.info
#crontab -e
# * * - /bin /sh /test/ex2.sh
三、变量
变量是shell传递数据的一种方法,用来代表每个取值的符号名。
shell有两类变量,临时变量和永久变量
临时变量是shell程序内部定义的,其使用范围仅限于定义它的程序,对其他程序不可见。包括:用户自定义变量、位置变量。永久变量是环境变量,其不随shell脚本的执行结果而消失。
永久变量
自定义变量
用户定义的变量由字母或者下划线开头,由字母、数字或者下划线序列组成,并且大小写字母意义不同。变量名长度没有限制。在使用变量值是,要在变量名前加上前缀“$” 。一般变量使用大写字母表示,并且全是英文字母开头,赋值符号“=”两边没有空格,如NUM=2,STRI="aaa"。可以将一个命令的执行结果赋值给变量,但是需要使用命令替换符号。注意单引号和双引号的区别,双引号是会把里面的变量值进行输出,单引号是会把内容原封不动输出,不会失败里面的变量。
使用set命令查看所有变量。
使用unset命令删除指定的变量。
占位变量
在shell中还有两种特殊的变量,一种是位置变量,还有一种是特殊的变量,在编写shell脚本的时候常用,一定要熟悉。
位置变量:ls -l file1 file2 file3 ...(n范围=1~9)在代码中使用$0-9进行代替。如下建立 ex3.sh
#!/bin/sh
DATE=`/bin/date +%Y%m%d`
echo "TODAY IS $DATE"
/bin/ls -l $
/bin/ls -l $
/bin/ls -l $
执行ex3.sh
特殊变量
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的PID
$! 执行上一个后台命令的PID
$? 执行上一个命令的返回值
$(0-9) 显示位置变量
建立文件 ex4.sh
#!/bin/sh
DATE=`/bin/date +%F`
echo "today is $DATE"
echo '$# :' $#
echo '$* :' $*
echo '$? :' $?
echo '$$ :' $$
echo '$0 :' $
四、read键盘录入
从键盘录入数据,赋值给变量
创建文件ex5.sh如下:
#!/bin/sh
read f s t #读三个参数
echo "the first is $f" #打印第一个参数
echo "the second is $s"
echo "the third is $t"
执行文件ex5.sh
-x表示跟踪 可以看到每个执行结果前都会有 +执行语句,方便调试
没有-x的情况下执行如下
五、shell运算符
expr命令,对整数进行运算。
注意:1.expr的运算必须用空格隔开
2. \*表示转义符
3.先算乘除后算加减,如果要优先运算,则需要加命令替换符
4.也可以对变量进行运算操作
5.“ · ”不能相互嵌套
六、测试命令
使用test命令可以对文件、字符串等进行测试,一般配合控制语句使用,不应该单独使用。
字符串测试:
test str1=str2 测试字符串是否相等
test str1 测试字符串是否不为空
test -n str1 测试字符串是否不为空
test -z str1 测试字符串是否为空
int测试:
test int1 -eq int2 测试整数是否相等
test int1 -ne int2
test int1 -ge int2
test int1 -gt int2
test int2 -le int2
test int1 -lt int2
文件测试:
test -d file 知道文件是否是目录
test -f file 文件是否为常规文件
test -x file 文件是否是可执行文件
test -r file 文件是否可读
test -w file 文件是否可写
七、if语句
语法格式 if test -d $1 then ... elif then .... else ... fi
变量测试语句可以用简化格式:[],比如test -d $1 等价于 [ -d $1 ] (注意空格)
#!/bin/sh
if [ -d $ ]
then
echo "a directory"
else
echo "not a directory"
fi
else 使用 “ elif then ”
八、逻辑与和逻辑或
#!/bin/sh
# -a -o
if [ $ -eq $ -a $ = ]
then
echo "param1 == param2 and param1 = 1"
elif [ $ -ne $ -o $ = ]
then
echo "param1 != param2 or param1 = 2"
else
echo "others"
fi
九、循环
for...done 语句格式
for 变量 in 名字表表
do
命令列表
done
#!/bin/sh
# for var in [params] do ... done
for var in
do
echo "number is $var"
done
十.select
格式:
select 变量 in 列表
do
cmd...
done
#!/bin/sh
# select var in [params] do ... done
select var in "java" "c++" "php" "linux" "python" "ruby" "c#"
do
break
done
echo "you selected $var"
十一、case
#!/bin/sh
read op
case $op in
a)
echo "you selected a";;
b)
echo "you selected b";;
c)
echo "you selected c";;
*)
echo "error"
esac
十二、while循环
#!/bin/sh
#while test do ... done num=
sum=
while [ $num -le ]
do
sum=`expr $sum + $num`
num=`expr $num + `
done
#sleep
echo $sum
#!/bin/sh
i=
while [ $i -le ]
do
i=`expr $i + `
if [ $i -eq -o $i -eq ]
then continue;
else
echo "this number is $i"
fi if [ $i -eq ]
then break;
fi
done
架构师养成记--37.简单shell编程的更多相关文章
- 架构师养成记--33.Redis哨兵、redis简单事务
Redis哨兵 有了主从复制,如果我想想对主从服务器进行监控,在redis2.6后提供了哨兵机制,2.6有哨兵1.0版本,并不稳定.2.8以后的哨兵功能才稳定起来. 顾名思义,哨兵就是监控Redis系 ...
- 架构师养成记--35.redis集群搭建
前记:redis哨兵经验之谈.哨兵做主从切换可能要花费一两秒,这一两秒可能会丢失很多数据.解决方法之一是在java代码中做控制,try catch 到 链接断开的异常就sleep 一两秒钟再conti ...
- 架构师养成记--19.netty
一.Netty初步 为什么选择Netty? 和NIO比较,要实现一个通信要简单得很多,性能很好.分布式消息中间件.storm.Dubble都是使用Netty作为底层通信. Netty5.0要求jdk1 ...
- 架构师养成记--15.Disruptor并发框架
一.概述 disruptor对于处理并发任务很擅长,曾有人测过,一个线程里1s内可以处理六百万个订单,性能相当感人. 这个框架的结构大概是:数据生产端 --> 缓存 --> 消费端 缓存中 ...
- 架构师养成记--32.Redis高级(安全 主从复制)
Redis高级命令及特性 keys * 返回满足的所有键值(*表示模糊匹配) exists 是否存在指定的key(返回1表示存在,0表示不存在) expire 设置某个key的过期时间,使用ttl查看 ...
- 架构师养成记--31.Redis的几种类型
String类型 Redis一共分为五种基本数据类型:String.Hash.List.Set.ZSet String类型是包含很多张类型的特殊类型,并且是二进制安全的.比如对序列化的对象进行存储,比 ...
- 架构师养成记--29.redis开篇
主要有从下几点讲解 NOSQL(Redis) 简介.redis安装与部署 Redis基础事件类型详解 Redis高级命令 Redis与java的使用 Redis集群搭建 Redis集群与spring的 ...
- 架构师养成记--25.linux用户管理
用户管理配置文件用户信息文件:/etc/passwd密码文件:/etc/shadow用户配置文件:/etc/login.defs /etc/default/useradd新用户信息文件:/etc/sk ...
- 架构师养成记--24.linux常用命令
一.Linux 文件 根据上文Linux 文件说明1.文件的rwx d开头表示文件夹, -开头的表示文件, l开头表示链接文件 r:read,w:write,x:execute ...
随机推荐
- 链接ftp,把文件或图片上传到ftp指定的文件夹中
/******************************************************************** * * * Filename : .java * Auth ...
- SVG与HTML、JavaScript的三种调用方式
一.在HTMl中访问SVG的DOM Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHig ...
- Visual Studio工具 vcpkg简介
博客参考: https://blog.csdn.net/cjmqas/article/details/79282847#43-%E7%A7%BB%E9%99%A4%E5%85%A8%E5%B1%80% ...
- Forms in Angular 2
Input handling is an important part of application development. The ng-model directive provided in A ...
- 2016-2017-20155329 《Java程序设计》第6周学习总结
学号 2016-2017-20155329 <Java程序设计>第6周学习总结 教材学习内容总结 数据从来源取出:输入串流 java.io.InputStream 写入目的的:输出串流 j ...
- .net二纬码标签打印
在企业开发中经常用到二纬码标签,本文详细介绍.net环境下整个二纬码解决方案. 开发环境 vs2008 DevExpress8.3 ThoughtWorks.QRCode (二纬码生成组件,高版 ...
- HDU 5120 Intersection (圆的面积交)
题意:给定两个圆环,求两个圆环的面积交. 析:很容易知道,圆环面积交就是,大圆与大圆面积交 - 大圆和小圆面积交 - 小圆和大圆面积交 + 小圆和小圆面积交. 代码如下: #pragma commen ...
- [转]Newtonsoft.Json 序列化和反序列化 时间格式
本文转自:http://www.cnblogs.com/litian/p/3870975.html 1.JSON序列化 string JsonStr= JsonConvert.SerializeObj ...
- CentOS 6.0下phpvod搭建教程(LAMP+phpvod)
之所以安装CentOS是因为之前试过RedHat,但是发现RedHat在安装时,无法获取安装源,原因是RedHat系统没有在RHN注册. 网上的很多教程都说可以直接换用CentOS的源,可我小搞里一会 ...
- ASP.NET Core2基于RabbitMQ对Web前端实现推送功能
在我们很多的Web应用中会遇到需要从后端将指定的数据或消息实时推送到前端,通常的做法是前端写个脚本定时到后端获取,或者借助WebSocket技术实现前后端实时通讯.因定时刷新的方法弊端很多(已不再采用 ...