一、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编程的更多相关文章

  1. 架构师养成记--33.Redis哨兵、redis简单事务

    Redis哨兵 有了主从复制,如果我想想对主从服务器进行监控,在redis2.6后提供了哨兵机制,2.6有哨兵1.0版本,并不稳定.2.8以后的哨兵功能才稳定起来. 顾名思义,哨兵就是监控Redis系 ...

  2. 架构师养成记--35.redis集群搭建

    前记:redis哨兵经验之谈.哨兵做主从切换可能要花费一两秒,这一两秒可能会丢失很多数据.解决方法之一是在java代码中做控制,try catch 到 链接断开的异常就sleep 一两秒钟再conti ...

  3. 架构师养成记--19.netty

    一.Netty初步 为什么选择Netty? 和NIO比较,要实现一个通信要简单得很多,性能很好.分布式消息中间件.storm.Dubble都是使用Netty作为底层通信. Netty5.0要求jdk1 ...

  4. 架构师养成记--15.Disruptor并发框架

    一.概述 disruptor对于处理并发任务很擅长,曾有人测过,一个线程里1s内可以处理六百万个订单,性能相当感人. 这个框架的结构大概是:数据生产端 --> 缓存 --> 消费端 缓存中 ...

  5. 架构师养成记--32.Redis高级(安全 主从复制)

    Redis高级命令及特性 keys * 返回满足的所有键值(*表示模糊匹配) exists 是否存在指定的key(返回1表示存在,0表示不存在) expire 设置某个key的过期时间,使用ttl查看 ...

  6. 架构师养成记--31.Redis的几种类型

    String类型 Redis一共分为五种基本数据类型:String.Hash.List.Set.ZSet String类型是包含很多张类型的特殊类型,并且是二进制安全的.比如对序列化的对象进行存储,比 ...

  7. 架构师养成记--29.redis开篇

    主要有从下几点讲解 NOSQL(Redis) 简介.redis安装与部署 Redis基础事件类型详解 Redis高级命令 Redis与java的使用 Redis集群搭建 Redis集群与spring的 ...

  8. 架构师养成记--25.linux用户管理

    用户管理配置文件用户信息文件:/etc/passwd密码文件:/etc/shadow用户配置文件:/etc/login.defs /etc/default/useradd新用户信息文件:/etc/sk ...

  9. 架构师养成记--24.linux常用命令

    一.Linux 文件 根据上文Linux 文件说明1.文件的rwx    d开头表示文件夹,    -开头的表示文件,    l开头表示链接文件    r:read,w:write,x:execute ...

随机推荐

  1. 链接ftp,把文件或图片上传到ftp指定的文件夹中

    /******************************************************************** *  * * Filename : .java * Auth ...

  2. SVG与HTML、JavaScript的三种调用方式

    一.在HTMl中访问SVG的DOM Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHig ...

  3. Visual Studio工具 vcpkg简介

    博客参考: https://blog.csdn.net/cjmqas/article/details/79282847#43-%E7%A7%BB%E9%99%A4%E5%85%A8%E5%B1%80% ...

  4. Forms in Angular 2

    Input handling is an important part of application development. The ng-model directive provided in A ...

  5. 2016-2017-20155329 《Java程序设计》第6周学习总结

    学号 2016-2017-20155329 <Java程序设计>第6周学习总结 教材学习内容总结 数据从来源取出:输入串流 java.io.InputStream 写入目的的:输出串流 j ...

  6. .net二纬码标签打印

    在企业开发中经常用到二纬码标签,本文详细介绍.net环境下整个二纬码解决方案. 开发环境  vs2008  DevExpress8.3  ThoughtWorks.QRCode (二纬码生成组件,高版 ...

  7. HDU 5120 Intersection (圆的面积交)

    题意:给定两个圆环,求两个圆环的面积交. 析:很容易知道,圆环面积交就是,大圆与大圆面积交 - 大圆和小圆面积交 - 小圆和大圆面积交 + 小圆和小圆面积交. 代码如下: #pragma commen ...

  8. [转]Newtonsoft.Json 序列化和反序列化 时间格式

    本文转自:http://www.cnblogs.com/litian/p/3870975.html 1.JSON序列化 string JsonStr= JsonConvert.SerializeObj ...

  9. CentOS 6.0下phpvod搭建教程(LAMP+phpvod)

    之所以安装CentOS是因为之前试过RedHat,但是发现RedHat在安装时,无法获取安装源,原因是RedHat系统没有在RHN注册. 网上的很多教程都说可以直接换用CentOS的源,可我小搞里一会 ...

  10. ASP.NET Core2基于RabbitMQ对Web前端实现推送功能

    在我们很多的Web应用中会遇到需要从后端将指定的数据或消息实时推送到前端,通常的做法是前端写个脚本定时到后端获取,或者借助WebSocket技术实现前后端实时通讯.因定时刷新的方法弊端很多(已不再采用 ...