架构师养成记--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 ...
随机推荐
- [leetcode]141. Linked List Cycle判断链表是否有环
Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...
- php判断一个数组是另一个数组的子集
需求最少的时间复杂度判断$a数组是否是$b数组的子集 // 快速的判断$a数组是否是$b数组的子集$a = array(135,138);$b = array(135,138,137); 实现方法 这 ...
- Luogu 4512 【模板】多项式除法
高级操作,感觉非常神仙. 题目中的字母太难懂了,重新定义一下. $$A(x) = B(x) * C(x) + D(x)$$ 其中,$A(x)$的次数是$n$,$B(x)$的次数是$m$,$A, B$都 ...
- [Jmeter]Jmeter环境搭建
Jmeter环境搭建 1. 拷贝 \\szpc1450\apache-jmeter-2.7 整个目录到本机(我是放在D盘,以下路径说明以D盘为例) 2. 拷贝\\szpc1450\Tools\au ...
- python pip 代理设置
pip install --proxy="user:password@server:port" packagename origin url: http://xiuxixiuxi. ...
- 前端福利之HTML5 UTF-8 中文乱码(转)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Google Tango初学者教程
Getting Started with the Tango Java API In this tutorial, we'll go through setting up your build env ...
- Centos环境下手动设置-网络参数配置-网络挨排错顺序-设置网卡为上网模式的设定
Linux中网络参数大致包含以下内容: IP地址 子网掩码 网关 DNS服务器 主机名(默认 localhost) 历来Linux系统中修改这些参数的方式通常有:命令.文件两种.其中通过命令设置可以立 ...
- ORACLE ERP 的前世今生
一个伟大的公司必有一个伟大的产品.如果说数据库是ORACLE在上世纪最后二十年赖以起家并奠定江湖地位的旗舰产品,那么,企业应用产品(或曰ERP)则毫无疑问是ORACLE在本世纪初的这近十年,征战疆场. ...
- delphi 10.1 berlin datasnap提交clientdataset.delta报:invalid variant type conversion(类型转换错误)问题的解决
delphi 10.1 berlin datasnap提交clientdataset.delta报:invalid variant type conversion(类型转换错误)问题的解决,需要打这个 ...