什么是shell?
shell是用户和内核沟通的接口和桥梁,用户=》shell命令解释器=》系统内核=》硬件
什么是shell脚本?
当linux命令或语句不在命令行下执行,而是通过一个程序文件执行时,该程序就被称为shell脚本或shell程序。shell程序类似dos系统下的批处理程序(扩展名*.bat)。用户可以在shell脚本中敲入一系列命令及命令语句组合。这些命令、变量和流程控制语句等有机的结合起来就形成一个强大的shell脚本。
Shell脚本在运维工作中的作用和地位?
Shell脚本很擅长处理纯文本类型的数据,而linux系统中几乎所有的配置文件、日志文件(如nfs、rsync、httpd、nginx、lvs等)、多数启动文件都是纯文本类型的文件。因此,如果学好Shell脚本语言,就可以利用它在linux系统中发挥巨大作用。

Shell脚本语言是弱类型语言,较为为通用的shell有标准的Bourne Shell和C shell,其中Bourne Shell已经被bash shell取代。
查看当前系统支持的Shell类型
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
常用文件测试操作符号:

测试操作符可通过man test查询
[root@localhost ~]# ls -l test.txt
-rw-r--r-- 1 root root 0 2月 18 18:05 test.txt
[root@localhost ~]# [ -f test.txt ]&&echo 1||echo 0
1
[root@localhost ~]# [ -f /root ]&&echo 1||echo 0
0
[root@localhost ~]# [ -d /root ]&&echo 1||echo 0
1
[root@localhost ~]# [ -e /root ]&&echo 1||echo 0
1
[root@localhost ~]# [ -r test.txt ]&&echo 1||echo 0
1
[root@localhost ~]# [ -w test.txt ]&&echo 1||echo 0
1
[root@localhost ~]# [ -x test.txt ]&&echo 1||echo 0
0
范例1:当条件1成立时,同时执行命令1、命令2、命令3
用法:
[ 条件1 ]&&{
命令1
命令2
命令3
}
[root@localhost ~]# cat tt.sh
[ $1 -eq 3 ]||{
echo 1
echo 1
echo 1
}
[root@localhost ~]# sh tt.sh 3
[root@localhost ~]# sh tt.sh 11
1
1
1
字符串测试操作符:
字符串测试操作符提示:
1) -n 比较字符串长度是否不为零,如果不为零则为真,如:[-n "$myvar"]
2)-z 比较字符串长度是否等于零,如果等于零则为真,如:[-z "$myvar"]
特别注意,对于以上表格中的字符串测试操作符号,如[-n '$myvar],要把字符串用‘’引起来
注意事项:
1.字符串或字符串变量比较都要加双引号以后再比较
2.字符串或字符串变量比较,比较符号两端最好都有空格,学习SHELL多参考系统脚本。
[root@localhost ~]# [ -n "adddd" ]&& echo 1 || echo 0
1
[root@localhost ~]# [ -n "" ]&& echo 1 || echo 0
0
[root@localhost ~]# [ -z "adddd" ]&& echo 1 || echo 0
0
[root@localhost ~]# [ ! -z "adddd" ]&& echo 1 || echo 0
1
[root@localhost ~]# aa="sssddd"
[root@localhost ~]# [ -n "$aa" ]&& echo 1||echo 0
1
[root@localhost ~]# [ -z "$aa" ]&& echo 1||echo 0
0
[root@localhost ~]# [ ! -z "$aa" ]&& echo 1||echo 0
1
[root@localhost ~]# [ "$aa" = "sssddd" ]&& echo 1||echo 0
1
[root@localhost ~]# [ "$aa" = "sse" ]&& echo 1||echo 0
0
整数二元比较操作符:
[root@localhost ~]# [ 2 -eq 1 ]&&echo 1||echo 0
0
[root@localhost ~]# [ 2 -lt 1 ]&&echo 1||echo 0
0
[root@localhost ~]# [ 2 -gt 1 ]&&echo 1||echo 0
1
[root@localhost ~]# [ 2 -ge 1 ]&&echo 1||echo 0
1
[root@localhost ~]# [ 2 -le 1 ]&&echo 1||echo 0
0
测试结论:
1.整数加双引号也是对的
2.[[]]用-eq等的写法也是对的,[[]]用>写法也可能不对,只比较第一位,逻辑结果不对。
3.[]用>号的写法语法每次,逻辑结果不对。
工作:推荐[]的-eq用法
整数比较推荐方法:
[ $num1 -eq $num2 ] #<==注意空格,和比较符号
(($num1 > $num2)) #<==无需空格,常规属性比较符号


[root@localhost ~]# f1=/etc/rc.local ;f2=/etc/services
[root@localhost ~]# [ -f "$f1" -a -f "$f2" ] && echo 1||echo 0
1
[root@localhost ~]# [ -f "$f1" -a -f "$f3" ] && echo 1||echo 0
0
[root@localhost ~]# [ -f "$f1" -o -f "$f3" ] && echo 1||echo 0
1
[root@localhost ~]# [[ -f "$f1" && -f "$f2" ]]&& echo 1||echo 0
1
[root@localhost ~]# [ -f "$f1" ] && [ -f "$f2" ]&& echo 1||echo 0
1
[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# [ $a -eq 2 -a $b -eq 2 ]&&echo 1||echo 0
0
[root@localhost ~]# [ $a -eq 1 -a $b -eq 2 ]&&echo 1||echo 0
1
[root@localhost ~]# [ $a -eq 2 -o $b -eq 2 ]&&echo 1||echo 0
1
[root@localhost ~]# [ ! $a -eq 2 -a $b -eq 2 ]&&echo 1||echo 0
1
特别声明:有关test.[],[[]]的操作符的用法,help test或man test 查询第一手帮助。
实例:开发shell脚本分别实现以定义变量,脚本传参以及read读入的方式比较2个整数大小。用条件表达式(禁止if)进行判断并以屏幕输出的方式提醒用户比较结果。注意:一共是开发三个脚本,当用脚本传参以及read读入的方式需要对变量是否为数字、并且传参个数不对给予提示。
判断是否是数字的方法:
[root@localhost ~]# [ "`echo "123a"|sed -r 's#[^0-9]##g'`" = "123a" ]&&echo 1||echo 00
[root@localhost ~]# [ "`echo "123"|sed -r 's#[^0-9]##g'`" = "123" ]&&echo 1||echo 0
1
解答:
#!/bin/sh
read -p "please input two num:" num1 num2
a=$num1
b=$num2
#no1
[ -z "$a" -o -z "$b" ]&&{
echo "USAGE:num1 num2"
exit 1
}
#no2
[ "`echo "$a"|sed -r 's#[^0-9]##g'`" = "$a" ]|| {
echo "first arg must be int."
exit 2
}
[ "`echo "$b"|sed -r 's#[^0-9]##g'`" = "$b" ]|| {
echo "first arg must be int."
exit 2
}
#no3
[ $a -lt $b ]&&{
echo "$a < $b"
exit 0
}
[ $a -gt $b ]&&{
echo "$a > $b"
exit 0
}
[ $a -eq $b ]&&{
echo "$a = $b"
exit 0
}
shell脚本vim/vi编辑模式下,可输入%s#aa#bb#g将文本里的aa字符全部替换成bb
实例:利用上述所学,完成一个菜单打印功能
要求:1.当用户输入1时,输出“start installing lamp.”然后执行/server/scripts/lamp.sh,脚本内容输出“lamp”后退出脚本;
2.当用户输入1时,输出“start installing lnmp.”然后执行/server/scripts/lnmp.sh,脚本内容输出“lnmp”后退出脚本;
3.当输入3时,退出当前菜单及脚本;
4.输入任何其他字符,给出提示“Input Error”后退出脚本
5.要对执行的脚本进行相关条件判断,例如:脚本是否存在,是否可执行等
解答:
#!/bin/sh
menu(){
cat <<END
1.[install lamp]
2.[install lnmp]
3.[exit]
pleas input the num you want:
END
}
menu
read num
[ "$num" = "1" ]&&{
echo "start installing lamp."
[ -x /server/scripts/lamp.sh ]||{
echo "lamp.sh cant exec."
exit 2
}
sh /server/scripts/lamp.sh
exit 0
}
[ "$num" = "2" ]&&{
echo "start installing lnmp."
[ -x /server/scripts/lnmp.sh ]||{
echo "lnmp.sh cant exec."
exit 2
}
sh /server/scripts/lnmp.sh
exit 0
}
[ "$num" = "3" ]&&{
echo "Bye."
exit 0
}
echo "input Error"
exit 1
浙公网安备 33010602011771号