Linux学习之二十一-shell编程基础
Shell编程基础
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 脚本(shell script),是一种为 shell 编写的脚本程序
Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了
- Linux中的shell种类(shell解释器的种类)
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
- 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、直接使用脚本的绝对路径即可
- 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"
- 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
- 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
- 00 * * * /bin/bash /service/scripts/backup.sh &>/dev/null
关于shell脚本的更多知识点,可以参考
http://www.runoob.com/linux/linux-shell.html
博主原创文章,转载请务必注明出处
Linux学习之二十一-shell编程基础的更多相关文章
- Linux 学习笔记 4:Shell 编程
1.简单过滤器 a. pr [OPTION] [FILE] 功能:改变文件打印格式 选项 功能 -l n 设定页面长度为n行 -w n 设定页面总宽度为n个字符(不够会被砍掉) -h str 设定页眉 ...
- Python学习札记(二十一) 函数式编程2 map/reduce
参考:map/reduce Note 1.map():map()函数接收两个参数,一个是函数,一个是Iterable.map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. ...
- 《Linux命令、编辑器与shell编程》第三版 学习笔记---002
<Linux命令.编辑器与shell编程>第三版 学习笔记---001 Linux命令.编辑器与shell编程 Shell准备 1.识别Shell类型 echo $0 echo $BAS ...
- 7-1 shell编程基础之二
shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...
- 【转】Shell编程基础篇-上
[转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...
- Linux学习(2)- 正则表达式基础
Linux学习(2)- 正则表达式基础 一.基础正则表达式介绍与练习 学习内容 正则表达式特殊符号 [:alnum:]代表英文大小写字母及数字 [:alpha:]代表英文大小写字母 [:blank:] ...
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- 【转】Shell编程基础篇-下
[转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...
- shell编程基础(转载)
Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...
随机推荐
- TOPCoder(一)Time
Class: Time Method: whatTime Parameters: int Returns: String Method signature: String whatTime( ...
- code forces 999C Alphabetic Removals
C. Alphabetic Removals time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Sed替换文本中的指定内容
可以这样做:方法1:sed -i 's/被替换的内容/要替换成的内容/' file 方法2:sed 's/被替换的内容/要替换成的内容/g' file > file.outmv file.out ...
- <a></a>的href属性失效
<a href="javascript:void(0);" class="close">关闭</a>
- js函数的参数
js函数的参数: js是弱类型的编程语言,调用函数时既不在乎函数的参数,也不在意参数的类型 即便你定义的函数值接受两个参数,在调用这个函数时也未必一定要是两个参数.可以传递一个.三个甚至不传递参数,而 ...
- bzoj3969 [WF2013]Low Power
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3969 [题解] 二分答案x,贪心选取,如果选取了i个,有j对,那么要满足i<=2*j* ...
- 限制MYSQL从服务器为只读状态
修改全局变量的方法有两种,第一种是修改配置文件,第二种是SQL语句设置全局变量的值.(可以参考:http://www.cnblogs.com/qlqwjy/p/8046592.html) 0.简介: ...
- 微信 编码要UTF8
<%@ WebHandler Language="C#" Class="Handler" %> using System; using System ...
- redis集群PHP解决方案
Redis3.2.4 Cluster集群搭建 服务器环境:192.168.3.229192.168.3.193每台服务器搭建3个节点,组成3个主节点,3个从节点的redis集群. 注意:防火墙一定要开 ...
- 反射main方法
利用Java反射机制去调用其他类的main方法基于这种情形: 当程序中的某个类在运行到某处需要去调用其他类的main方法时,如果此程序并不知道此main方法所属类的名称,而只是在程序中接受某一代表此m ...