该课程主要包括以下内容:
① Shell的基本语法结构
如:变量定义、条件判断、循环语句(for、until、while)、分支语句、函数和数组等;
② 基本正则表达式的运用;
③ 文件处理三剑客:grep、sed、awk工具的使用;
④ 使用shell脚本完成一些较复杂的任务,如:服务搭建、批量处理等。
说明:以上内容仅仅是基本要求,还有很多更深更难的语法需要扩充学习。
程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如C、C++
程序不需要编译,程序在运行时由解释器翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Python/JavaScript/ Perl /ruby/Shell等都是解释型语言。
编译型语言比解释型语言速度较快,但是不如解释型语言跨平台性好。如果做底层开发或者大型应用程序或者操作系开发一般都用编译型语言;如果是一些服务器脚本及一些辅助的接口,对速度要求不高、对各个平台的兼容性有要求的话则一般都用解释型语言。
总结:
[root@MissHou ~]# cat /etc/shells
/bin/sh #是bash shell的一个快捷方式
/bin/bash #bash shell是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能
/sbin/nologin #表示非交互,不能登录操作系统
/bin/dash #小巧,高效,功能相比少一些
/bin/tcsh #是csh的增强版,完全兼容csh
/bin/csh #具有C语言风格的一种shell,具有许多特性,但也有一些缺陷
用户在终端(终端就是bash的接口)输入命令
| bash //bash就是shell的一种类型(bash shell) | kernel | 物理硬件等
什么是shell脚本?
简单来说就是将需要执行的命令保存到文本中,按照顺序执行。它是解释型的,意味着不需要编译。
若干命令 + 脚本的基本格式 + 脚本特定语法 + 思想= shell脚本
什么时候用到脚本?
重复化、复杂化的工作,通过把工作的命令写成脚本,以后仅仅需要执行脚本就能完成这些工作。
①自动化分析处理
②自动化备份
③自动化批量部署安装
④等等...
如何学习shell脚本?
多看——>多模仿——>多练多写
x
//脚本第一行, #!魔法字符,指定脚本代码执行的程序。即它告诉系统这个脚本需要什么解释器来执行,也就是使用哪一种Shell
//以下内容是对脚本的基本信息的描述
# Name: 名字
# Desc:描述describe
# Path:存放路径
# Usage:用法
# Update:更新时间
//下面就是脚本的具体内容
commands
...
脚本执行方法:
xxxxxxxxxx
[root@MissHou shell01]# cat 1.sh
#xxxx
#xxx
#xxx
hostname
date
[root@MissHou shell01]# chmod +x 1.sh
[root@MissHou shell01]# ll
total 4
-rwxr-xr-x 1 root root 42 Jul 22 14:40 1.sh
[root@MissHou shell01]# /shell/shell01/1.sh
MissHou.itcast.cc
Sun Jul 22 14:41:00 CST 2018
[root@MissHou shell01]# ./1.sh
MissHou.itcast.cc
Sun Jul 22 14:41:30 CST 2018
xxxxxxxxxx
[root@MissHou shell01]# bash 1.sh
MissHou.itcast.cc
Sun Jul 22 14:42:51 CST 2018
[root@MissHou shell01]# sh 1.sh
MissHou.itcast.cc
Sun Jul 22 14:43:01 CST 2018
[root@MissHou shell01]#
[root@MissHou shell01]# bash -x 1.sh
+ hostname
MissHou.itcast.cc
+ date
Sun Jul 22 14:43:20 CST 2018
-x:一般用于排错,查看脚本的执行过程
注意:如果脚本没有加可执行权限,不能使用标准的执行方法执行,bash 1.sh
Tab只能补全命令和文件 (RHEL6/Centos6)
xxxxxxxxxx
^c 终止前台运行的程序
^z 将前台运行的程序挂起到后台
^d 退出 等价exit
^l 清屏
^a |home 光标移到命令行的最前端 //编辑命令
^e |end 光标移到命令行的后端 //编辑命令
^u 删除光标前所有字符 //编辑命令
^k 删除光标后所有字符 //编辑命令
^r 搜索历史命令 //命令需连续
xxxxxxxxxx
*: 匹配0或多个任意字符
?: 匹配任意单个字符
[list]: 匹配[list]中的任意单个字符 //[abc]、[1-4]
[!list]: 匹配除list中的任意单个字符
{string1,string2,...}:匹配string1,string2或更多字符串
本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。
环境变量:当前进程有效,并且能够被子进程调用。
xxxxxxxxxx
[root@MissHou tmp]# export A=hello //临时将一个本地变量(临时变量)变成环境变量
[root@MissHou tmp]# env|grep ^A
A=hello
xxxxxxxxxx
$HOME/.bashrc 当前用户的bash信息(aliase、umask等)
$HOME/.bash_profile 当前用户的环境变量
$HOME/.bash_logout 每个用户退出当前shell时最后读取的文件
/etc/bashrc 使用bash shell用户全局变量
/etc/profile 系统和每个用户的环境变量信息
/etc/profile——>$HOME/.bash_profile——>$HOME/.bashrc——>/etc/bashrc——>$HOME/.bash_logout
xxxxxxxxxx
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
若退出状态值为0,表示命令运行成功
若退出状态值为127,表示command not found
若退出状态值为126,表示找到了该命令但无法执行(权限不够)
若退出状态值为1&2,表示没有那个文件或目录
$$:当前所在进程的进程号 echo $$ eg:kill -9 `echo $$` = exit 退出当前会话
$!:后台运行的最后一个进程号 (当前终端) # gedit &
!$ 调用最后一条命令历史中的参数
!! 调用最后一条命令历史
$#:脚本后面接的参数的个数
$*:脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开
$@: 脚本后面所有参数,参数是独立的,也是全部输出
$0:当前执行的进程/程序名 echo $0
$1~$9 位置参数变量
${10}~${n} 扩展位置参数变量 第10个位置变量必须用{}大括号括起来
[root@MissHou shell01]# cat 2.sh
#!/bin/bash
#xxxx
echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$11 = ${11}"
echo "\$12 = ${12}"
了解$*和$@的区别:
$* :表示将变量看成一个整体
$@ :表示变量是独立的
#!/bin/bash
for i in "$@";do
echo $i
done
echo "======我是分割线======="
for i in "$*";do
echo $i
done
[root@MissHou shell01]# bash 3.sh a b c
a
b
c
======我是分割线=======
a b c
xxxxxxxxxx
1. 默认情况下,shell里定义的变量是不分类型的,可以给变量赋与任何类型的值;等号两边不能有空格,对于有空格的字符串做为赋值时,要用引号引起来
变量名=变量值
2. 变量的获取方式: $变量名 ${变量名}
[root@MissHou shell01]# a=12345678
[root@MissHou shell01]# echo $a
12345678
[root@MissHou shell01]# echo ${a}
12345678
[root@MissHou shell01]# echo ${a:2:3} a表示变量名;2表示从第3个字符开始;3表示后面3个字符
345
3. 取消变量: unset 变量名
4. 区分大小写,同名称但大小写不同的变量名是不同的变量
5. 变量名可以是字母或数字或下划线,但是不能以数字开头或者特殊字符
[root@MissHou shell01]# 1a=hello
-bash: 1a=hello: command not found
[root@MissHou shell01]# ?a=hello
-bash: ?a=hello: command not found
[root@MissHou shell01]# _a=hello
[root@MissHou shell01]# echo $_a
hello
6. 命令的执行结果可以保存到变量
7. 数组
数组定义:用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:
array=(var1 var2 var3 var4)
或者
array[0]=v1
array[1]=v2
array[3]=v3
[root@MissHou shell01]# user=(u1 u2 u3)
[root@MissHou shell01]# echo $user
u1
[root@MissHou shell01]# echo ${user[1]}
u2
[root@MissHou shell01]# echo ${user[2]}
u3
[root@MissHou shell01]# echo ${user[0]}
u1
[root@MissHou shell01]# echo ${user[@]}
u1 u2 u3
[root@MissHou shell01]# echo ${user[*]}
u1 u2 u3
读取数组:
${array [i]} i表示元素
使用@ 或 * 可以获取数组中的所有元素:
获取第一个元素
echo ${user[0]}
echo ${user[*]} 获取数组里的所有元素
echo ${!array[@]} 获取数组元素的索引下标
echo ${array[@]:1:2} 访问指定的元素
举例:
# for i in `echo ${user[*]}`;do echo "hello,$i";done
[root@MissHou shell01]# name=(stu1 stu2 stu3)
[root@MissHou shell01]# echo ${name[@]}
stu1 stu2 stu3
[root@MissHou shell01]# for i in $(echo ${name[@]});do echo "hello,$i";done
hello,stu1
hello,stu2
hello,stu3
8. 有类型变量 declare
-i 将变量看成整数
-r 使变量只读 readonly
-x 标记变量通过环境导出 export
9. 交互式定义变量的值 read 主要用于让用户去定义变量值
-p 提示信息
-n 字符数
-s 不显示
-t 超时(默认单位秒)
[root@MissHou shell01]# cat 1.txt
10.1.1.1 255.255.255.0
[root@MissHou shell01]# read -p "Input your IP and Netmask:" ip mask < 1.txt
[root@MissHou shell01]# echo $ip
10.1.1.1
[root@MissHou shell01]# echo $mask
255.255.255.0
10. 其他变量(扩展)
1)取出一个目录下的目录和文件:dirname和 basename
2)变量"内容"的删除和替换
一个“%”代表从右往左去掉一个/key/
两个“%%”代表从右往左最大去掉/key/
一个“#”代表从左往右去掉一个/key/
两个“##”代表从左往右最大去掉/key/
# A=/root/Desktop/shell/mem.txt
# echo $A
/root/Desktop/shell/mem.txt
# dirname $A 取出目录
/root/Desktop/shell
# basename $A 取出文件
mem.txt
# echo ${A%/*} 从右往左去掉“/*”内容
/root/Desktop/shell
# echo ${A%%.*} 从右往左最大长度去掉.后的内容
/root/Desktop/shell/mem
# echo ${A%%.txt} 从右往左最大长度去掉.txt内容
/root/Desktop/shell/mem
# echo ${A##/*/} 从左往右最大去掉所有"/*/"
mem.txt
# echo ${A#/*/}
Desktop/shell/mem.txt
[root@MissHou shell01]# echo $dir
/shell/shell01/1.sh
[root@MissHou shell01]# echo ${dir%/*}
/shell/shell01
[root@MissHou shell01]# echo ${dir%%/*}
[root@MissHou shell01]# echo ${dir%%.*}
/shell/shell01/1
[root@MissHou shell01]# echo ${dir%%.}
/shell/shell01/1.sh
[root@MissHou shell01]# echo $dir
/shell/shell01/1.sh
[root@MissHou shell01]# echo ${dir##*/}
1.sh
[root@MissHou shell01]# echo ${dir#*/}
shell/shell01/1.sh
[root@MissHou shell01]# echo ${dir#/*/}
shell01/1.sh
[root@MissHou shell01]#
//以下扩展内容自己练习完成
1000 url=www.taobao.com
1001 echo ${#url} 获取变量的长度
1008 echo ${url#*.}
1009 echo ${url##*.}
1011 echo ${url%.*}
1012 echo ${url%%.*}
替换:/ 和 //
1015 echo ${url/ao/AO}
1017 echo ${url//ao/AO} 贪婪替换
替代: - 和 :- +和:+
1019 echo ${abc-123}
1020 abc=hello
1021 echo ${abc-444}
1022 echo $abc
1024 abc=
1025 echo ${abc-222}
${变量名-新的变量值} 或者 ${变量名=新的变量值}
变量没有被赋值:会使用“新的变量值“ 替代
变量有被赋值(包括空值): 不会被替代
1062 echo ${ABC:-123}
1063 ABC=HELLO
1064 echo ${ABC:-123}
1065 ABC=
1066 echo ${ABC:-123}
${变量名:-新的变量值} 或者 ${变量名:=新的变量值}
变量没有被赋值或者赋空值:会使用“新的变量值“ 替代
变量有被赋值: 不会被替代
1116 echo ${abc=123}
1118 echo ${abc:=123}
[root@server ~]# unset abc
[root@server ~]# echo ${abc:+123}
[root@server ~]# abc=hello
[root@server ~]# echo ${abc:+123}
123
[root@server ~]# abc=
[root@server ~]# echo ${abc:+123}
${变量名+新的变量值}
变量没有被赋值或者赋空值:不会使用“新的变量值“ 替代
变量有被赋值: 会被替代
[root@server ~]# unset abc
[root@server ~]# echo ${abc+123}
[root@server ~]# abc=hello
[root@server ~]# echo ${abc+123}
123
[root@server ~]# abc=
[root@server ~]# echo ${abc+123}
123
${变量名:+新的变量值}
变量没有被赋值:不会使用“新的变量值“ 替代
变量有被赋值(包括空值): 会被替代
[root@server ~]# unset abc
[root@server ~]# echo ${abc?123}
-bash: abc: 123
[root@server ~]# abc=hello
[root@server ~]# echo ${abc?123}
hello
[root@server ~]# abc=
[root@server ~]# echo ${abc?123}
${变量名?新的变量值}
变量没有被赋值:提示错误信息
变量被赋值(包括空值):不会使用“新的变量值“ 替代
[root@server ~]# unset abc
[root@server ~]# echo ${abc:?123}
-bash: abc: 123
[root@server ~]# abc=hello
[root@server ~]# echo ${abc:?123}
hello
[root@server ~]# abc=
[root@server ~]# echo ${abc:?123}
-bash: abc: 123
${变量名:?新的变量值}
变量没有被赋值或者赋空值时:提示错误信息
变量被赋值:不会使用“新的变量值“ 替代
说明:?主要是当变量没有赋值提示错误信息的,没有赋值功能
算术运算:默认情况下,shell就只能支持简单的整数运算
xxxxxxxxxx
+ - * / %(取模,求余数)
xxxxxxxxxx
Bash shell 的算术运算有四种方式:
1、使用 $(( ))
2、使用$[ ]
3、使用 expr 外部程式
4、使用let 命令
注意:
n=1
let n+=1 等价于let n=n+1
[root@MissHou ~]# expr 1 - 1
0
[root@MissHou ~]# expr 1 * 8 //乘法需要对*进行转意
expr: syntax error
[root@MissHou ~]# expr 1 \* 8
8
[root@MissHou ~]# expr 1 / 8
0
[root@MissHou ~]# expr 1 % 8
1
[root@MissHou ~]# n=1
[root@MissHou ~]# let n+=1
[root@MissHou ~]# echo $n
2
[root@MissHou ~]# let n=n+2
[root@MissHou ~]# echo $n
4
[root@MissHou ~]# let n-=1
[root@MissHou ~]# echo $n
3
[root@MissHou ~]# let n=n-1
[root@MissHou ~]# echo $n
2
[root@MissHou ~]#
[root@MissHou ~]# let n*=8
[root@MissHou ~]# echo $n
16
[root@MissHou ~]# let n=n*2
[root@MissHou ~]# echo $n
32
[root@MissHou ~]# let n/=4
[root@MissHou ~]# echo $n
8
[root@MissHou ~]# let n=n/4
[root@MissHou ~]# echo $n
2
[root@MissHou ~]# let n**2
[root@MissHou ~]# echo $n
2
[root@MissHou ~]# let n**=2 //错误写法
-bash: let: n**=2: syntax error: operand expected (error token is "=2")
[root@MissHou ~]# let n=n**2
[root@MissHou ~]# echo $n
4
[root@MissHou ~]# let n=n**2
[root@MissHou ~]# echo $n
16
[root@MissHou ~]# n=2
[root@MissHou ~]# echo $n
2
[root@MissHou ~]# let n=n**8
[root@MissHou ~]# echo $n
256
思考:能不能用shell做小数运算?
[root@server shell01]# echo 1+1.5|bc
2.5
i++ 和 ++i (了解)
对变量的值的影响:
[root@node1 ~]# i=1
[root@node1 ~]# let i++
[root@node1 ~]# echo $i
2
[root@node1 ~]# j=1
[root@node1 ~]# let ++j
[root@node1 ~]# echo $j
2
对表达式的值的影响:
[root@node1 ~]# unset i j
[root@node1 ~]# i=1;j=1
[root@node1 ~]# let x=i++ 先赋值,再运算
[root@node1 ~]# let y=++j 先运算,再赋值
[root@node1 ~]# echo $i
2
[root@node1 ~]# echo $j
2
[root@node1 ~]# echo $x
1
[root@node1 ~]# echo $y
2
总结:
xxxxxxxxxx
$(()) $[]
expr
let n+=1 let n=n+1
i++ ++i 对变量本身没有影响;表达式中有影响
说明:
man test去查看,很多的参数都用来进行条件判断
xxxxxxxxxx
-e 是否存在 不管是文件还是目录,只要存在,条件就成立
-f 是否为普通文件
-d 是否为目录
-S socket
-p pipe
-c character
-b block
-L 软link
-s 是否为空白文件 说明:-s表示非空,! -s 表示空文件
xxxxxxxxxx
-r 当前用户对其是否可读
-w 当前用户对其是否可写
-x 当前用户对其是否可执行
-u 是否有suid
-g 是否sgid
-k 是否有t位
xxxxxxxxxx
file1 -nt file2 比较file1是否比file2新
file1 -ot file2 比较file1是否比file2旧
file1 -ef file2 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode
xxxxxxxxxx
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
xxxxxxxxxx
-z 是否为空字符串 字符串长度为0,就成立
-n 是否为非空字符串 只要字符串非空,就是成立
string1 = string2 是否相等
string1 != string2 不等
! 结果取反
xxxxxxxxxx
逻辑判断符号:
-a 和 && (and 逻辑与)
-o 和 ||(or 逻辑或)
! 逻辑非
[ 1 -eq 1 -a 1 -ne 0 ]
[ 1 -eq 1 -o 1 -ne 1 ]
[root@server shell01]# [ 1 -eq 0 ] && echo true || echo false
false
[root@server shell01]# [ 1 -eq 1 ] && echo true || echo false
true
总结:
1、; && ||都可以用来分割命令
2、; 完全不考虑前面的语句是否正确执行,都会执行;号后面的内容
3、&& 需要考虑&&前面的语句的正确性,前面语句正确执行才会执行&&后的内容;反之亦然
4、|| 需要考虑||前面的语句的非正确性,前面语句执行错误才会执行||后的内容;反之亦然
5、如果&&和||一起出现,从左往右依次看,按照以上原则
xxxxxxxxxx
示例:
数值比较:
[root@server ~]# [ $(id -u) -eq 0 ] && echo "the user is admin"
[root@server ~]$ [ $(id -u) -ne 0 ] && echo "the user is not admin"
[root@server ~]$ [ $(id -u) -eq 0 ] && echo "the user is admin" || echo "the user is not admin"
类C风格的数值比较:
1159 ((1==2));echo $?
1160 ((1<2));echo $?
1161 ((2>=1));echo $?
1162 ((2!=1));echo $?
1163 ((`id -u`==0));echo $?
1209 ((a=123));echo $a
1210 unset a
1211 ((a==123));echo $?
注意:在(( ))中,=表示赋值;==表示判断
字符串比较:
注意:双引号引起来,看作一个整体
1196 a='hello world';b=world
1197 [ $a = $b ];echo $?
1198 [ "$a" = "$b" ];echo $?
1199 [ "$a" != "$b" ];echo $?
1200 [ "$a" !== "$b" ];echo $? 错误
1201 [ "$a" == "$b" ];echo $?
1202 test "$a" != "$b";echo $?
注意:= 和 == 在 [ 字符串 ] 比较中都表示判断
思考:[ ] 和 [[ ]] 有什么区别?
1213 a=
1214 test -z $a;echo $?
1215 a=hello
1216 test -z $a;echo $?
1217 test -n $a;echo $?
1217 test -n "$a";echo $?
# [ '' = $a ];echo $?
-bash: [: : unary operator expected
2
# [[ '' = $a ]];echo $?
0
1278 [ 1 -eq 0 -a 1 -ne 0 ];echo $?
1279 [ 1 -eq 0 && 1 -ne 0 ];echo $?
1280 [[ 1 -eq 0 && 1 -ne 0 ]];echo $?
F:false 假
T:true 真
xxxxxxxxxx
if [ condition ];then
command
command
fi
[ 条件 ] && command
xxxxxxxxxx
if [ condition ];then
command1
else
command2
fi
[ 条件 ] && command1 || command2
xxxxxxxxxx
if [ condition1 ];then
command1 结束
elif [ condition2 ];then
command2 结束
else
command3
fi
注释:
如果条件1满足,执行命令1后结束;如果条件1不满足,再看条件2,如果条件2满足执行命令2后结束;如果条件1和条件2都不满足执行命令3结束.
xxxxxxxxxx
if [ condition1 ];then
command1
if [ condition2 ];then
command2
fi
else
if [ condition3 ];then
command3
elif [ condition4 ];then
command4
else
command5
fi
fi
注释:
如果条件1满足,执行命令1;如果条件2也满足执行命令2,如果不满足就只执行命令1结束;
如果条件1不满足,不看条件2;直接看条件3,如果条件3满足执行命令3;如果不满足则看条件4,如果条件4满足执行命令4;否则执行命令5
需求1:判断当前主机是否和远程主机是否ping通
xxxxxxxxxx
思路:
1. 使用哪个命令实现 ping
2. 根据命令的执行结果状态来判断是否通
3. 根据逻辑和语法结构来编写脚本
步骤:
#!/bin/bash
#xxx
read -p "请输入远程主机的IP地址:" ip
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "当前主机可以和远程主机$ip互通"
else
echo "当前主机可以和远程主机$ip不能互通"
fi
或者
#!/bin/bash
ping -c1 $1 &>/dev/null
test $? -ne 0 && echo "当前主机可以和远程主机$1不能互通" || echo "当前主机可以和远程主机$1互通"
进一步改进:
#!/bin/bash
if [ $# -ne 1 ];then
echo "语法错误,Usage:$0 远程IP地址" && exit
else
ping -c1 $1 &>/dev/null
test $? -ne 0 && echo "当前主机可以和远程主机$1不能互通" || echo "当前主机可以和远程主机$1互通"
fi
或者
test $# -ne 1 && echo "语法错误,Usage:$0 远程IP地址" && exit
ping -c1 $1 &>/dev/null
test $? -ne 0 && echo "当前主机可以和远程主机$1不能互通" || echo "当前主机可以和远程主机$1互通"
需求2:判断一个进程是否存在
xxxxxxxxxx
#!/bin/bash
read -p "请输入需要判断的进程名(vsftpd):" pid
ps -ef|grep $pid|grep -v 'grep' &>/dev/null
或者
pgrep -l $pid &>/dev/null
[ $? -eq 0 ] && echo "该进程$pid存在" || echo "该进程不存在"
pgrep命令:以名称为依据从运行进程队列中查找进程,并显示查找到的进程id
选项
-o:仅显示找到的最小(起始)进程号;
-n:仅显示找到的最大(结束)进程号;
-l:显示进程名称;
-P:指定父进程号;pgrep -p 4764 查看父进程下的子进程id
-g:指定进程组;
-t:指定开启进程的终端;
-u:指定进程的有效用户ID。
需求3:判断一个服务是否正常(以httpd为例):
思路:
xxxxxxxxxx
#!/bin/bash
wget http://www.myblog.net &>/dev/null
[ $? -eq 0 ] && echo "该web服务是正常的" && rm -f /shell/shell01/index.* || echo "该web服务异常请检查"
1、输入一个用户,用脚本判断该用户是否存在
xxxxxxxxxx
#!/bin/bash
read -p "Input your username:" name
id $name &>/dev/null
或者
grep -w $name /etc/passwd &>/dev/null
test $? -eq 0 && echo "该用户$name是存在的" || echo "该用户$name是不存在的"
2、判断vsftpd软件包是否安装,如果没有则自动安装(yum源已配好)
xxxxxxxxxx
#!/bin/bash
rpm -q vsftpd &>/dev/null
[ $? -ne 0 ] && yum -y install vsftpd || echo "该软件包已经安装"
3、判断当前内核主版本是否为2,且次版本是否大于等于6;如果都满足则输出当前内核版本
xxxxxxxxxx
#!/bin/bash
kernel=`uname -r`
var1=`echo $kernel|cut -d. -f1`
var2=`echo $kernel|cut -d. -f2`
test $var1 -eq 2 -a $var2 -ge 6 && echo $kernel || echo "当前内核版本不符合要求"
或者
#!/bin/bash
test $(echo ${kernel:0:1}) -eq 2 -a $(echo ${kernel:2:1}) -ge 6 && echo $kernel || echo '不符合要求'
test ${kernel:0:1} -eq 2 -a ${kernel:2:1} -ge 6 && echo $kernel || echo '不符合要求'
uname -r|grep ^2.[6-9] || echo '不符合要求'
4、判断ftp服务是否已启动,如果已启动输出以下信息:
vsftpd服务器已启动... vsftpd监听的端口是: vsftpd的进程PID是:
xxxxxxxxxx
参考1:
#!/bin/bash
service vsftpd status &>/dev/null
if [ $? -eq 0 ];then
port=`netstat -tnltp|grep vsftpd|cut -d: -f2|cut -d' ' -f1`
pid=`pgrep -l vsftpd|cut -d ' ' -f1`
echo -e "vsftpd服务器已启动...\nvsftpd监听的端口是:$port\nvsftpd的进程PID是:$pid"
else
service vsftpd start &>/dev/null
port=`netstat -tnltp|grep vsftpd|cut -d: -f2|cut -d' ' -f1`
pid=`pgrep -l vsftpd|cut -d ' ' -f1`
echo -e "vsftpd服务器已启动...\nvsftpd监听的端口是:$port\nvsftpd的进程PID是:$pid"
fi
参考2:
#! /bin/bash
duankou=`netstat -ntlp|grep vsftpd|cut -d: -f2|cut -d" " -f1`
pid=`pgrep -o vsftpd`
pgrep -l vsftpd >/dev/null
if [ $? -eq 0 ];then
echo "vsftpd服务器已启动..."
echo "vsftpd监听的端口是:$duankou"
echo "vsftpd的进程PID是:$pid"
else
echo "vsftpd服务器没启动"
service vsftpd start
source /lt/2.sh
fi
1、 判断/tmp/run目录是否存在,如果不存在就建立,如果存在就删除目录里所有文件 2、 输入一个路径,判断路径是否存在,而且输出是文件还是目录,如果是字符连接,还得输出是有效的连接还是无效的连接 3、交互模式要求输入一个ip,然后脚本判断这个IP 对应的主机是否 能ping 通,输出结果类似于: Server 10.1.1.20 is Down! 最后要求把结果邮件到本地管理员root@localhost和mail01@localhost 4、写一个脚本/home/program,要求当给脚本输入参数hello时,脚本返回world,给脚本输入参数world时,脚本返回hello。而脚本没有参数或者参数错误时,屏幕上输出“usage:/home/program hello or world” 5、写一个脚本自动搭建nfs服务