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. Windows获取FSMO角色

    获取 FSMO 角色若要使用 Ntdsutil 实用工具获取 FSMO 角色,请按照下列步骤操作:1.登录到基于 Windows 2000 Server 或 Windows Server 2003 的 ...

  2. C语言.c和.h

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:       1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成 ...

  3. 自定义View Measure过程(2)

    目录 目录 1. 作用 测量View的宽/高 在某些情况下,需要多次测量(measure)才能确定View最终的宽/高: 在这种情况下measure过程后得到的宽/高可能是不准确的: 建议在layou ...

  4. 强引用(StrongReference)、弱引用(WeakReference)、软引用(SoftReference)、虚引用(PhantomReference)

    1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间 ...

  5. Application binary interface and method of interfacing binary application program to digital computer

    An application binary interface includes linkage structures for interfacing a binary application pro ...

  6. Linux Oracle DB log 清理

    sid_list=`/bin/ps -ef |/bin/grep smon |/bin/grep -v grep | /bin/cut -f3 -d_` host_name=`hostname` cd ...

  7. 【linux高级程序设计】(第十二章)Linux多线程编程 4

    读写锁 书上有读者写者的代码,我实在是懒得实现一遍了.跟之前的代码差不多. 多线程异步信号处理 int pthread_kill (pthread_t __threadid, int __signo) ...

  8. Appium+python自动化5-Appium Inspector【转载】

    前言    appium Inspector从入门到放弃!反正你都打开了,那就看下为什么要放弃吧! Appium Inspector是appium自带的一个元素定位工具,上一篇介绍了如何使用uiaut ...

  9. 在C#中调用格式工厂进行任意视频格式到FLV的转换

    1.下载安装格式工厂和完美解码器 2.运行格式工厂,转换一个RMVB到FLV,注意找个大点的,使时间长一些.防止在未执行步骤3时就结束了 3.在进程中查看某个进程的命令行参数是什么? wmic pro ...

  10. 使用overtrue/socialite实现第三方登陆

    composer下载包 将申请的配置内容放在.ENV文件中 在services.php文件中引用 控制器 其他第三方登陆同理,拿到client_id,client_secret 和redirect_u ...