运维界的卡乐咪

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

什么是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

 

posted on 2020-02-25 00:11  卡乐咪运维  阅读(284)  评论(0)    收藏  举报