shell脚本编程入门
脚本编程基础
案例
- 快速远程登录主机
#!/bin/bash
#远程登录主机
#by zhangjinshan
read -p “请输入要登陆的主机名” name #给出提示符
IP=`cat ip.txt | grep "${name}" | awk -F ":" '{print$2}'`
#显示主机名和ip地址,
#过滤出主机名的内容
#以":"为分隔符,输出2列内容
ssh ${IP} #ssh服务需要安装,这里客户机用户名和服务器用户名相同,省咯了用户名
echo "主机:${name},登录成功“
注:echo后的单引号表示强引用,单引号里面是什么内容就输出什么,而双引号是弱引用,变量的值会代替变量名输出
- 检查一组命令所花费时间
#!/bin/bash
#文件名: time_take.sh
start=$(date +%s) #当前时间时间戳
command #所检查的命令
end=$(date +%s)
different=$((end - start))
echo $different
echo ‘’Time taken to execute commands is $difference seconds.‘’
批量重命名扩展名
思考:
既然要批量替换文件名,那么肯定得用一个for循环依次遍历指定目录下的每个文件。
对于每个文件,假如该文件的名称为name.oldext,那么我们必须原始文件名中挖出name,再将它与新的文件扩展名newext拼接形成新的文件名name.newext。
依照这样的思路,就诞生了下面的脚本:
#!/bin/bash
read -p "old extension:" oldext #给出提示符
read -p "new extension:" newext
read -p “The directory:” dir #dir指定文件所在目录
cd $dir
for file in $(ls $dir | grep .$oldext)
do
name=$(ls $file | cut -d. -f1)
mv $file ${name}.$newext
echo "$name.$oldext ====> $name.$newext"
done
echo "all files have been modified.“
下面对针对这个程序作简单说明:
1.变量oldext和newext分别指定旧的扩展名和新的扩展名。dir指定文件所在目录;
2.“ls dir∣grep.dir | grep .dir∣grep.oldext”用来在指定目录dir中获取扩展名为旧扩展名的所有文件;
3.在循环体内先利用cut命令将文件名中“.”之前的字符串剪切出来,并赋值给name变量;接着将当前的文件名重命名为新的文件名。
变量定义规则
变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
等号两侧不能有空格。
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
变量的值如果有空格,需要使用双引号或单引号括起来。
脚本应用场景
应用场景
(1)监控linux环境变量的使用情况
(2)数据的处理,日志的切割、分析、统计等
(3)与数据库的交互,对数据库进行增删改查
(4)监控进程,自动化启停服务进程
(5)完成一些重复性的工作,创建100个新文件或者计算100个计算式等等
Shell常见解释器
解释器:一种命令解释器,主要作用是对命令进行运行和解释,将需要执行的操作传递给操作系统内核并执行
四种解释器:
#!/bin/bash(默认)
#!/bin/ksh
#!/bin/bsh
#!/bin/sh
#!”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行
注意:shell脚本运行不一定需要解释器,有些脚本没有解释器也可以运行
Shell脚本执行方式
Shell脚本主要有两种执行方式:
a.将脚本作为可执行文件执行
$chmod a+rx filename #文件创建默认是没有执行权限的,要给加上权限
$./filename
b.启动一个shell子进程来执行脚本(采用bash+脚本路径,文件不需执行权限)
$bash filename
两种方法的区别是:
第一种,本质是脚本需要自己执行,所以需要执行权限。
第二种,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。
Chmod权限设置
功能:改变文件的读写和执行权限。
命令格式:chmod {u|g|o|a}{+|-|=}{r|w|x} filename
u(user): 用户本人。 g(group): 同组用户。
o(oher): 其他用户。 a(all): 所有用户。
r(read)读许可,表示可拷贝该文件或目录内容。
w(write)写许可,表示可修改该文件或目录内容。
x(execute)执行许可,表示可执行该文件。
+:用于给予指定用户的许可权限。
-:用于取消指定用户的许可权限 。
=:将所许可的权限赋给文件。
Linux常用命令
- 目录处理命令
ls :列出目录内容。
cp :复制文件或目录。
mkdir :创建目录。
rm :删除新文件或目录。
pwd :查看当前所在文件夹路径。
mv :移动或重命名文件或目录。
- 文件操作命令
touch :如果文件不存在,新建文件。
more :分页显示文件内容。
head :显示文件前面几行。
tail :显示文件后面几行。
find :查找文件和目录。
- 权限管理命令
chmod :修改文件权限。
chown :修改文件所有者。
chgrp :修改文件所属组。
- 文本处理命令
cat :查看文件内容。
grep :在文件中搜索指定的模式。
sed :对文本进行替换、删除等操作
- 进程管理与网络通信命令
ps :显示当前运行的进程。
kill :终止指定的进程。
ssh :远程登录到另一台计算机。
telnet :查看服务器指定端口是否可用。
ifconfig :查看和设置网卡配置信息。
ping :测试网络连接。
- 其它常用命令
man :获得帮助信息。
whatis :获得命令的简单介绍信息。
whereis :命令所在目录及帮助文档路径。
history :查看命令历史记录。
date :显示或设置系统日期和时间。
shutdown/reboot :关闭或重启系统。
read命令
语法格式:read -参数
-p:给出提示符,默认不支持”\n“换行
-s:隐藏输入的内容
-t :给出等待的时间,超出会退出read
-n:限制读取字符的个数,触发时到临界的值会自动执行
案例1
#!/bin/bash
if
read -t 20 -s -p "Enter depth password in 20 seconds(once) > " pass1 && printf "\n" && #第一次输入密码
read -t 20 -s -p "Enter depth password in 20 seconds(again)> " pass2 && printf "\n" && #第二次输入密码
[ $pass1 == $pass2 ] #判断两次输入的密码是否相等
then
echo "Valid depth password"
else
echo "Invalid depth password"
fi
案例2
#!/bin/bash
echo "请选择您的操作:"
echo "1. 显示当前目录内容"
echo "2. 显示系统信息"
echo "3. 退出"
read -p "请输入选项(1/2/3):" choice
case $choice in
1)
echo "当前目录内容:"
ls
;;
2)
echo "系统信息:"
uname –a #unix name,如主机名、内核版本号
;;
3)
echo "感谢使用,再见!"
exit 0
;;
*)
echo “无效选项,请重新运行并输入正确选项。"
exit 1
;;
esac
小提示:
exit表示一个进程结束。exit(0)表示程序正常, exit(1)和exit(-1)表示程序异常退出,exit(2)表示系统找不到指定的文件
Find命令
命令介绍
Find指令将从指定目录向下递归遍历其各个子目录,将满足条件或者目录显示在终端。
基本语法
find [搜索范围] [选项]
$ find . -print #打印文件和目录的列表
. 指定当前目录,.. 指定父目录。
选项说明
-name <查询方式> #按照指定文件名查找模式查找文件
-user<用户名> #查找用户名所有文件
-size<文件大小> #按照大小查找文件
$ find . -iname "example*" -print
./example.txt
./EXAMPLE.txt
时间选项
-atime、-mtime、-ctime