一、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. AES加解密

    AES加密类 <?php //php aes加密类 class AESMcrypt { public $iv = null; public $key = null; ; private $cip ...

  2. 产品设计师 VS UX设计师:你更想成为哪一个?

    随着互联网的快速发展,越来越多的应届毕业生也成为设计师的一员.他们当中的许多人选择UX设计师作为第一份工作,也有一些人选择做一个产品设计师.你是否也想成为设计师呢?这两种设计师你更倾向于哪一个呢?在你 ...

  3. ToList和ToDataTable(其中也有反射的知识)

    using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Refle ...

  4. genymotion的安装

    1.安装virtualBox google的模拟器是运行在qemu上面的. genymotion这个模拟器运行在virtualBox上面.

  5. MySQL—练习

    前面学习了MySQL的语句的基本用法,这里就开始做一些MySQL练习,这套题目一共45题,属于比较简单的,初学先试着做这个. 参考链接:https://www.cnblogs.com/SJP666/p ...

  6. BFC开启条件

    当元素CSS属性设置了下列之一时,即可创建一个BFC: float:left|right position:absolute|fixed display: table-cell|table-capti ...

  7. sql2008 获取表结构说明

    SELECT     表名       = case when a.colorder=1 then d.name else '' end,    表说明     = case when a.color ...

  8. maven项目搜索依赖jar包顺序

    local_repo  >  settings_profile_repo  >  pom_profile_repo  >  pom_repositories  >  setti ...

  9. yum初识

    yum仓库中的元数据文件: primary.xml.gz 所有RPM包的列表: 依赖关系: 每个RPM安装生成的文件列表: filelists.xml.gz 当前仓库中所有RPM包的所有文件列表: o ...

  10. ADO.NET操作SQL Server:数据库操作类(未封装)

    1.添加数据 /// <summary> /// 添加数据 /// </summary> /// <param name="newEntity"> ...