一:什么是脚本
安装一定逻辑关系记录命令的文件
在此文件有可执行权限的情况下可以用文件名称发起脚本内记录命令的执行
shell脚本是一种解释形语言,文件内记录的动作需要解释器shell
二:建立脚本
1.
vim test.sh
以.sh结尾,,’.sh’不是系统规定的,但是是业界的规范写法
2.
#!/bin/bash 指定解释器
##脚本头的写法,这是脚本使用的解释器,,也就是默认脚本运行时开启的shell
运行时会开启一个子shell
ps ef可以查看
3.
脚本内容时用命令和命令执行的关系组成
4.脚本执行的方式
方法一:
sh 脚本名
方法二:chmod +x 脚本
给脚本可执行权限绝对路径去调用
sh -x test.sh 调试
+ 脚本执行的动作
脚本的输出
三 :编写脚本的规范
1.
脚本中应添加脚本的说明细信息
Author(作者) : lee
Email(邮箱,即联系方式) : lee@westos.com
Create_Date(创建时间) :2017-08-21
Vesion(版本) :1.0
Description(描述) :test scripts
…
2.
脚本中尽量不要使用中文,哪怕用拼音代替
3.
脚本中出现的() | [] | {} | <> 等等成对出现的符号要一次性打出,并且内容中的字符与这些符号要有空格
4.
脚本中的语句要一次写完,然后在丰富内容
5.
语句中使用的动作要缩进写入,使脚本易读
6.
如何让vim自动添加脚本说明
首先,可以写一个用来编写的脚本,就是用这个脚本去调用vim
#!/bin/bash
cat >>$1 <<end
#!/bin/bash
#Author :
#Email :
#Create_Date :
#Vesion(版本) :
#Description :
end
vim $1
但这是一种很笨的方法
可以直接编辑vim的配置文件
打开/etc/vimrc
在最后添加
map <F4> ms : call AddTile()<cr>'s ##设定快捷键,注意前面的快捷键设置的空格,前后都要有空格!,不然快捷键没有用
fuction Addtile() ##指定函数内容
call append(0,"# Author :") ##0,表示第一行
call append(1,"# Email :")
call append(2,"# Create_Date :".strftime("%Y-%m-%d")) 后面的函数是写入时间,自动获取当前执行快捷键时的时间
call append(3,"# Description :")
endfuction ##也可以自己继续细化,比如添加#!/bin/bash 空行等等
保存退出后,只需要正常打开你的vim,编辑模式下按相应设置的快捷键就可以添加这些内容了
四.命令
1.diff
比较两个文件的不同
diff
[num1,num2][a|c|d][num3,num4]
a :添加
c :改变
d :删除
num1,num2 第一个文件的内容
num3,num4 第二个文件的内容
diff -r dir1 dir2 比较两个目录的不同
给脚本打补丁
diff -u file file1 >file.path ##补丁文件.path结尾
安装patch
man patch : 用法: patch 目标文件 补丁文件
patch file file.path ##将file还原为file1
patch -b file file.path ##-b 表示备份原文件为file.orig
2.
grep
grep -n
grep -n3
grep -A3
grep -B3
grep -i
grep -v
grep -E
grep ^test
grep test$
grep "\<test"
grep "test\>"
脱字符 (caret) ^ 和美元标记 (dollar) $
分别是匹配一行的首部和尾部的空字串的元字符。符号 \< 和 \>
分别是匹配一个词的首部和尾部的空字串的元字符。符号 \b 匹配一个词边缘
(edge) 的空字串,符号 \B 匹配 不 处于一个词的边缘的空字串。
3.
cut
-d : 表示后面的是以 : 为分隔符
实验 ,将可以登陆的用户的用户名过滤出来
cut -c 1-4|1,4
cut -d : -f 1,7 | -f 1-3
[root@desktop mnt]# grep -E "\<bash$|\&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;tcsh$|\<sh$|\&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;csh$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
student:x:1000:1000:Student User:/home/student:/bin/bash
westos:x:1001:1001::/home/westos:/bin/bash
[root@desktop mnt]# grep -E "\<bash$|\&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;tcsh$|\<sh$|\&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;csh$" /etc/passwd | cut -d : -f 1
root
student
westos
[root@desktop mnt]# grep -E "\<bash$|\&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;tcsh$|\<sh$|\&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;csh$" /etc/passwd | awk -F : '{print $1}'
4.awk
TEST="###################"
awk -F 分隔符 -v TEST=$TEST 'BEGIN {print TEST} {print$1} END{print TEST}' /etc/passwd ##将/etc/passwd 下以:为分割的第一个字符筛选出来前后输出TEST变量的值 ,-v 将变量传递进去,因为shell的变量不能直接传递到awk里面
awk -F ":" -v TEST=$TEST 'BEGIN {print TEST ":"} {print $2} END{print TEST}' /etc/passwd
查看网卡在 /proc/net/dev 查看网卡设备
5.
echo -n 不换行 -e 指定颜色
echo -ne “\r \r” 刷掉前面的
6.
sed
-i 输入到某个文件中
sed 's/sbin/westos' passwd
sed '1,5s/sbin/westos/g' passwd
sed '/1p/,/shutdown/s/sbin/westos/g' passwd
sed -e 's/sbin/westos' -e 's/nologin/redhat' passwd
sed -5d passwd
sed -5p passwd
sed -n 5p passwd
vim file
s/sbin/westos/g
s/nologin/lee/g
sed -f file passwd ##-f 指定策略
执行脚本就可以建立文件中的用户
userfile 里面是用户
num=` wc -l /mnt/userfile | awk '{print $1}' `
for i in ` seq 1 $num `
do
USERNAME=` sed -n "$i"p /mnt/userfile `
useradd $USERNAME
done
五,变量
1.作用
2.变量的命名规则
首字母不能是数字,变量中只能包含字母数字下划线
TEST
TEST_REDHAT
TEST_Redhat
tesTRedhat 驼峰
3.变量设定的方式
环境级 : 当前环境生效,当前环境关闭,失效 export 声明
环境级的变量重启shell就失效了
export A=1
用户级 : 只针对配置过的用户生效,其他用户无法使用
vim /root/.bash_profile
export A=1
source /root/.bash_profile
变量谁在后,谁生效
系统级 :
echo $$ 可以查看脚本运行的id
export A=1 将A声明为全局变量,就可以在不同shell中使用,重启shell失效
4.命令别名设定
alias
/etc/profile 系统级的
vim /etc/bashrc 用户级的
在里面添加,每个用户都可以用
unalias 删除
alias xie=’vim’
vim ~/.bashrc
alias xie=’vim’
vim /etc/bashrc
alias xie=’vim’
unalias xie
5.变量定义方式
方法一:
USER=root
方法二:
$0 脚本本身
$1 $2 $3 $n
$* 所有字符串
$# 后面字符串的个数
$? 命令的退出值 1..26 命令对象有问题
26..172 命令找不到
172..255 命令有但是参数有问题
0 成功
&& 退出值为0 就。
|| 退出值不为零,就。
方法三:
read -p "input your ipaddress" IP
clear
ping -c1 -w1 $IP &>/dev/null && echo $IP is up || echo $IP is down
检测脚本输入的ip,若ping通返回up 不然就是down
read -p "" IP
clear 清屏
test -a 且
6.shell脚本中函数的定义
TEST()
{
echo hello world
}
TEST
最后写的TEST表示调用
ACCTION()
{
ACTION()
{
read -p "please input your ipaddress : " IP
#clear
[ -n "$IP" ]&&(
ping -c1 -w1 $IP &>/dev/null && echo $IP is up || echo $IP is down
)||(
echo -e "\033[31mplease IP !!!\033[0m"
ACTION
)
}
}
MAIN()
{
echo "do you want to check ip ? :
CHECK_IP(C) QUIT(Q)"
read -p "Input action: " WORD
WANT=echo "$WORD | tr 'a-z' 'A-Z'"
case $WANT in
C)
ACTION
MAIN
;;
Q)
echo "GUN!"
exit 0
;;
*)
echo "please input C or Q"
MAIN
esac
}
MAIN
7.变量对比
test = []
man test
8.特殊符号转义和注释
# 注释 ! 非 $ ...
\ 转义单个字符
'' 强引用 ,可以批量转义
"" 弱引用 ,不能转义$ , ! , \ , ` (反向单引号)
9.变量的声明
${}... {}内部的是声明的
a=1
$ab = 空
${a}b = 1b
六.四则运算
1.运算法则
++ i++ i=i+1
– i– i=i-1
+= j+=i j=j+i
-= j-=i j=j-i
+ | - | * | / | ** (幂运算) | %
2.运算命令
格式 : $[ 1 + 2 ]
let A=3+2
expr 3+2 //这个用法没有** 需要对运算符号加 “”
3.
调用函数的时候,如果函数内部也要用
1
* 那么调用的时候一定要加在后面 USER
1
2
七.脚本中的常用语句
1.
for
do
done
2.
while
do
done
3.
if
then
elif
then
else
fi
4.
case
5
.expect
expect
yum install expect -y
interact 保留交互
expect eof
nteract 保留交互
expect eof
nteract 保留交互
expect eof