Shell编程基础

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 脚本(shell script),是一种为 shell 编写的脚本程序

Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了

  1. Linux中的shell种类(shell解释器的种类)

[root@localhost ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh

  1. shell脚本基本规则及执行

在shell脚本文件中,第一行要指明使用哪种shell解释器

#!/bin/bash            #指定shell解释器为bash

从第二行开始的内容就是若干命令

例:简单的shell脚本

#!/bin/bash

pwd

mkdir -p test{1..10}

touch test{1..10}/oldboy{1..10}

ifconfig eth0|awk -F "[: ]+" 'NR==2{print $4}'>>ip.txt

echo "hello world!"

parted /dev/sda p

shell脚本的执行方式

方法1、bash + 脚本名称

方法2、sh + 脚本名称

可以使用参数sh -x 进入到debug调试模式,查看执行过程

方法3、./ + 脚本名称

方法4、直接使用脚本的绝对路径即可

  1. shell脚本引用变量

3.1 如果shell脚本全部是命令,灵活性会比较差,可以通过引用变量来实现,变量可以直接赋值也可以通过执行命令来赋值

变量的命名规则:

不能和系统已有的命令名字相同(多用大写字母),不能以数字开头

只能以下划线,字母开头,变量中间允许有数字

不能和系统当前已有的环境变量相同

3.2 执行命令env查看当前的环境变量

只查看系统所有环境变量名称env|awk -F "=" '{print $1}'

调用环境变量echo %变量名%

3.3 特殊环境变量$PS1可以自定义终端命令提示符

echo $PS1

PS1='[\u@\h \W]\$'

PS1='[\[\e[31;1m\]\t\[\e[0m\] \u@\h \W]#'

[root@localhost ~]# echo $PS1

[\u@\h \W]\$

[root@localhost ~]# PS1='[\[\e[31;1m\]\t\[\e[0m\] \u@\h \W]#'

[20:56:21 root@localhost ~]#

3.4 引用变量实例

#!/bin/bash

name=`hostname`

echo "你当前的主机名是 $name"

ip=`ifconfig eth0|awk -F "[: ]+" 'NR==2{print $4}'

echo "你当前的ip地址为$ip"

ks_line=`cat /root/anaconda-ks.cfg|wc -l`

echo "ks文件检测 共$ks_line行"

rpm_count=`rpm -qa|wc -l`

echo "rpm包检测 共$rpm_count个"

ip_r=`route -n|awk '$1=="0.0.0.0" && $2=="10.0.0.254"'|wc -l`

echo "网关检测 合格值为$ip_r"

log_file=`wc -l /tmp/install.log|wc -l`

echo "install日志检测 合格值为$log_file"

se_status=`sestatus|awk '{print $NF}'`        #sestatus查看selinux状态

echo "selinux状态检查 状态为$se_status"

ssh_config=`cat /etc/ssh/sshd_config|wc -l`

echo "ssh 优化检测 合格值为$ssh_config"

  1. shell脚本中的for循环

例1:若需要批量创建10个用户,并生成随机密码并进行修改,且重定向到文件中显示用户名和密码

#!/bin/bash

for i in `seq -f stu%g 1 5`

do

useradd $i;PASS=`date +%N|md5sum|cut -c 1-8`;echo $i:$PASS >> passwd.txt;echo $PASS|passwd --stdin $i

done

例2:利用for循环,来优化开机启动项

#!/bin/bash

for i in `chkconfig|grep '^[a-Z]'|awk '{print $1}'|sed '$d'`; #先关闭所有开机启动项

do

echo $i

chkconfig $i off

done

 

for j in network crond sysstat rsyslog sshd;    #再开启需要的启动项

do

chkconfig $j on

done

例3:利用for循环,将txt结尾的文件修改为TXT

#!/bin/bash

for i in `ls *.txt`

do

old_name=`echo $i|awk -F "." '{print $1}'`

mv $i ${old_name}.TXT

done

例4:嵌套for循环

批量创建10个以oldboy开头的目录,并在目录中创建10个大于300k的文件要求使用dd命令来创建文件

#!/bin/bash

mkdir oldboy{1..10}

for n in oldboy{1..10}

do

    for m in test{1..10}

    do

        dd if=/dev/zero of=${n}/$m bs=101k count=3

    done

done

5、shell脚本中的if判断语句

有关判断的参数

gt    大于

eq    等于

lt    小于

ge    大于等于

le    小于等于

-o     逻辑或

-z    判断输入的是否为空

-n    判断输入的是否不为空

例1:猜数字游戏

#!/bin/bash

num1=`echo $RANDOM*35/32767+1|bc`

read -p "请输入一个数字:" num2

echo $num1

if [ $num1 -gt $num2 ];then

echo "你猜的小了"

elif [ $num1 -eq $num2 ];then

echo "恭喜你,猜对了!"

else

echo "你猜的大了"

fi

例2:利用固定用法read -p '*** ' str来读取shell执行后用户输入的内容,判断是否为空

#!/bin/bash

read -p '请输入一个字符串:' str

echo $str

if [ -z $str ];then

    echo "你输入的内容不能为空!"

fi

  1. shell脚本生产案例

定时打包备份,保留最近一周的备份文件,过去的文件保留周六的

mkdir -p /service/scripts

cd /service/scripts/

注意:此处要求备份七天以外每周六的内容,可以选择在周六刚刚过渡到周天的日期即周天凌晨,这样周六的内容备份才较为完整,备份内容为周六的,那么压缩包的名称需要用date命令的-d yesterday参数

#!/bin/bash

####beifen

W=`date +%w`

if [ $W -eq 0 ];then

tar zcvf /backup/6_etc_`date -d yesterday +%F`.tar.gz /etc

else

tar zcvf /backup/etc_`date -d yesterday +%F`.tar.gz /etc

fi

####qingli

find /backup -type f -name "*.tar.gz" -mtime +7|grep -v '6_etc_'|xargs rm –rf

编写脚本进行测试,修改当前时间并备份,最后同步时间

#!/bin/bash

for n in `seq -w 24`

do

date -s "201804$n";/bin/bash /service/scripts/backup.sh

done

ntpdate ntp1.aliyun.com

再把脚本写到定时任务中

#on time backup

  1. 00 * * * /bin/bash /service/scripts/backup.sh &>/dev/null

 

关于shell脚本的更多知识点,可以参考

http://www.runoob.com/linux/linux-shell.html

 

博主原创文章,转载请务必注明出处

Linux学习之二十一-shell编程基础的更多相关文章

  1. Linux 学习笔记 4:Shell 编程

    1.简单过滤器 a. pr [OPTION] [FILE] 功能:改变文件打印格式 选项 功能 -l n 设定页面长度为n行 -w n 设定页面总宽度为n个字符(不够会被砍掉) -h str 设定页眉 ...

  2. Python学习札记(二十一) 函数式编程2 map/reduce

    参考:map/reduce Note 1.map():map()函数接收两个参数,一个是函数,一个是Iterable.map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. ...

  3. 《Linux命令、编辑器与shell编程》第三版 学习笔记---002

    <Linux命令.编辑器与shell编程>第三版 学习笔记---001 Linux命令.编辑器与shell编程 Shell准备 1.识别Shell类型 echo  $0 echo $BAS ...

  4. 7-1 shell编程基础之二

    shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...

  5. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  6. Linux学习(2)- 正则表达式基础

    Linux学习(2)- 正则表达式基础 一.基础正则表达式介绍与练习 学习内容 正则表达式特殊符号 [:alnum:]代表英文大小写字母及数字 [:alpha:]代表英文大小写字母 [:blank:] ...

  7. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  8. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  9. shell编程基础(转载)

    Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...

随机推荐

  1. AGC023E - Inversion

    Description \(n \le 2*10^5\) 给定限制序列 \(A\) 求满足 \(P_i\le A_i\) 的所有排列中 逆序对个数的和 Solution 考虑知道一个 \(A\) 序列 ...

  2. 创建型设计模式之工厂模式(Abstract Factory)

    结构            意图         提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性     一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个 ...

  3. jquery 追加元素的方法(append prepend after before 的区别)

    append() 方法在被选元素的结尾插入内容. prepend() 方法在被选元素的开头插入内容. after() 方法在被选元素之后插入内容. before() 方法在被选元素之前插入内容. &l ...

  4. IOS-NSDate之今天,昨天,这周,这个月,上个月

    http://blog.csdn.net/xdrt81y/article/details/8425727 今天跟大家讨论日期的用法,相信大家在项目中,经常会设置一个默认时间段,比如一周前到今天.下面教 ...

  5. android hook 框架 libinject 如何实现so注入

    前面两篇 android hook 框架 libinject2 简介.编译.运行 android hook 框架 libinject2 如何实现so注入 实际运行并分析了 Android中的so注入( ...

  6. EditText双光标问题

    模拟器会出现中双的光标   从没有字符开始输入多了一个竖线怎么回事?光标丢失就好了,下面是手机情况 修改样式更换一个样式试试看:比如我以前的是 android:theme="@android ...

  7. Java IO 学习(六)Java的Direct Memory与IO

    ByteBuffer的源码中有这样一段注释: A byte buffer is either direct or non-direct. Given a direct byte buffer, the ...

  8. 陕西师范大学第七届程序设计竞赛网络同步赛 I 排队排队排队【数组任一位可以移动到队头,最少移动几次增序/数组指针操作】

    链接:https://www.nowcoder.com/acm/contest/121/I来源:牛客网 题目描述 ACM竞赛队内要开运动会啦!!!! 竞赛队内的一群阳光乐观积极的队员们迅速的在操场上站 ...

  9. 干净卸载mysql

    一.在控制面板中卸载mysql软件 二.卸载过后删除C:\Program Files (x86)\MySQL该目录下剩余了所有文件,把mysql文件夹也删了 三.windows+R运行“regedit ...

  10. 【hdu3652】数位dp(浅尝ACM-A)

    向大佬学习 第一次写博客有点紧张,也算是小萌新的突破吧 这次主要是总结一下校内的ACM比赛的各种题,主要是新思路以及学到的新知识 先放一张 下面开始说正事 题面 A wqb-number, or B- ...