shell及其脚本
一. shell
1. shell认知
shell是用户与内核之间交互的接口,用户通过shell进行交互(命令)或非交互(shell脚本)的方式以达到对系统的操作和交互
2. shell脚本
安装一定逻辑关系记录命令的文件
第一行:#!/bin/bash #"#!"为约定的标记,表示脚本需要什么解释器进行解释,默认脚本运行时开启的子shell
ps -xf #表示查看所使用shell的位置指向
注:通常第一行采用#!/usr/bin/env bash,进行申明,表示不管在什么地方,将bash找到并且运行
脚本描述语的快速运行:
vim /etc/vimrc
注:map表示映射,按F4键可进行快速编写描述语
脚本内容的快速修改:
注:利用Dir=/var/log/变量关系,可以减轻工作量,进行批量修改,只需修改变量关系即可
3. 特殊符号转译和注释
\ #表示转译
'' #表示强引
"" #表示弱引
三. 常用命令
1. diff
diff hello hello.new #比较两个文件的不同
[num1,num2][a|c|d][num1,num2] #表示第一个文件的第几行比第二个文件的第几行增加或替换或删除,两个文件就相同
diff -u hello hello.new > hello.path
yum install -y patch
patch hello.new hello.path #对hello.new文件进行打补丁
注:在对文件进行打补丁时,将会保留源文件
2. grep
find查找文件,grep查找或过滤字符
grep root /mnt/passwd
grep root -i /mnt/passwd #-i表示不区分大小写
grep -i ^root /mnt/passwd #表示以root开头
grep -i root$ /mnt/passwd #表示以root结尾
grep -i ^root$ /mnt/passwd
#表示以root开头和结尾
grep -i root /mnt/passwd | grep -i ^root
grep -i root /mnt/passwd | grep -i ^root -v #-v表示反向过滤
grep -i root /mnt/passwd | grep -i -E "^root|root$" -v
grep -i "\<root" /mnt/passwd | grep -i -E "^root|root$" -v
grep -i "root\>" /mnt/passwd | grep -i -E "^root|root$" -v
grep -i "\<root\>" /mnt/passwd | grep -i -E "^root|root$" -v #表示含有root为整体且不以root开头和结尾
eg:
查找可登陆系统用户
grep "\<bash\>" /etc/passwd
grep -n hello passwd #显示查找行号
grep -n2 hello passwd #显示查找行号及上下各两行
grep -A2 hello passwd #显示查找字符及后两行
grep -B2 hello passwd #显示查找字符及前两行
grep hello -r /mnt/ #从目录中筛选字符及所在文件
3. cut
cut -d : -f 2 passwd #-d指定分隔符;-f指定列,截取文件第二列
cut -d : -f 2,5 passwd #截取文件第二和第五列
cut -d : -f 2-5 passwd #截取文件第二到五列
cut -c 3 passwd #-c指定字符,截取第三个字符
cut -c 1,3 passwd #截取第一和第三个字符
cut -c 1-3 passwd #截取第一到三个字符
eg1:
列出可登陆系统的用户名称
grep "\<bash\>" /etc/passwd | cut -d : -f 1
eg2:
编写脚本,通过输入网卡名称获取ip---awk
awk -F ":" -v TEST=$TEST 'BEGIN {print TEST ":"} {print $2} END{print TEST}' 文件
注:sh -x执行脚本时,可查看脚本执行过程
4. echo
5. sed
sed 's/sbin/westos/g' passwd #全文替换sbin为westos,属于临时生效
sed '1,5s/sbin/westos/g' passwd #替换1-5行
sed '/adm/,/sync/s/sbin/westos/g' passwd #替换从adm此行到sync此行
sed 's/sbin/westos/g' -i passwd #全文替换并保存
sed -e 's/sbin/westos/g' -e 's/nologin/linux/g' passwd #同步进行替换
cat -n passwd | sed 5p #重复查看第5行
cat -n passwd | sed 5d #查看第五行以外的
cat -n passwd | sed -n 5p #只查看第五行
eg1:
编写shell脚本,通过执行脚本写出httpd端口数值进行直接改变
eg2:
编写shell脚本,通过文件执行shell脚本,使得文件中的用户可以直接通过运行shell脚本进行创建
注:sed 's/enabled\ =\ 1/enabled\ =\ 0/g' -i 文件 #表示将文件中'enabled = 1'替换成'enabled = 0'
四. 变量
export a=1 #环境级,只针对当前环境生效,当前环境关闭,变量失效
vim .bash_profile #用户级,只针对配置过的用户生效,其他用户无法使用
source .bash_profile #source刷新方能生效
vim /etc/profile #系统级
脚本执行路径:
环境级:
用户级:
vim .bash_profile
source .bash_profile
系统级:
vim /etc/profile
1. 命令别名设定
ls与/usr/bin/ls区别:
vim别名'xie'的设定
环境级:alias xie='vim'
系统级:
vim /etc/bashrc #alias xie='vim'
source /etc/bashrc
eg:创建用户并设定密码
注:编写脚本可以通过提示,进行创建,删除,退出
2. 变量定义
1> USER=root
2> $0 $1 $2 $3 $n $* $# $?
3> read -p " " IP
eg:
read -p "please input you want create username: " USERNAME
read -p "please input a password for $USERNAME: " -s PASSWORD #-s表示不显示密码
3. 函数定义
TEST()
{
echo hello world
}
TEST
eg1:
注:关键在于设定函数READ和ACTION_DO,当ACTION_DO执行过程中与READ相匹配时,执行相对应的动作,最后再次执行函数是为达到循环的效果
eg2:检测哪台主机可以连接
注:ping -c1 -w1 $IP &> /dev/null && echo $IP is up ||echo $IP is down表示如果ping通就输出up,不通就输出down
4. 变量对比
test = [ ]
注:"!"表示否定
"-a"表示并且,"-o"表示或者
"-eq"表示等于;"-ne"表示不等于;"-gt"表示大于;"-ge"表示大于等于;"-lt"表示小于;"-le"表示小于等于
eg:
"-n"表示目标不为空,"-z"表示目标为空
eg:
拓展:
"-e"表示存在;"-b"表示block;"-f"表示file;"-d"表示directory;"-S"表示socket;"-L"表示link;"-ot"表示前者比后者老或者旧"-nt"表示前者比后者新
eg:
五. 四则运算
1. 运算法则
++ i++ i=i+1
-- i-- i=i-1
+= j+=i j=j+i
-= j-=i j=j-i
+
-
*
/
**
%
2. 运算命令
$[ 3 + 2 ]
let A=3+2
expr 3+2
eg1:10s倒计时
注:echo -ne "\r \r"表示刷新前一秒的记录
eg2:1m10s倒计时
拓展:备份数据库
延伸1:
注:"$?" == "0"表示命令没有出错
延伸2:
测试:
六. 脚本中的常用语句
1.
for #定义变量及变量范围
do #执行的命令操作
done
eg:创建用户并逐行对应密码
2.
while
do
done
eg:
3.
if #表判断,假设
then #执行假设所对应动作
elif #再次假设
then #执行假设所对应动作
else #逻辑关系所对应的最后一种假设,并执行相应动作
fi
eg:
测试:
4.
case #对条件同时访问,不同于if,需要逐个假设
5.
.expect
yum install -y expect
eg1:
注:lindex $argv 0 为命令后第一个字符串,exp_continue为不退出expect环境继续执行后续动作
eg2:只显示被连接主机的主机名
方式一:
方式二:
注:以上方式均为在shell中进入expect环境,在shell中才可利用sh执行脚本
eg3:检测在某一ip范围内开机的主机名
注:continue为继续执行动作,exit为退出脚本,break为换行
eg4:检测ip在某一范围内可连接的主机,并在可连主机上创建用户并设定逐行相对应的密码
测试: