shell前情介绍

1. shell介绍

    shell是一个程序,采用C语言编写,是用户和linux内核沟通的桥梁。它既是一种命令语言,又是一种解释性的编程语言。通过一个图表来查看一下shell的作用。

       

  kernel(内核):管理硬件并驱动硬件完成工作

  user:用户接口,用户下指令给内核

  shell:命令解释器,把用户输入的命令解析成二进制交给内核

 什么是shell脚本?

  shell脚本就是将完成一个任务的所有的命令按照执行的先后顺序,自上而下写入到一个文本文件中,然后给予执行权限。

  一个最简单的例子:安装nginx的shell脚本

  

  修改shell脚本的权限为可执行权限(chmod 700即可)

  检查是否安装好nginx时需要把防火墙关闭:

    查看 SElinux(一套增强Linux系统安 全的强制访问控制体系)状态:getenforce

    临时关闭 SElinux:setenforce 0

    永久关闭 SElinux:vim /etc/selinux/config   将SELINUX=enforcing改为SELINUX=disabled,保存退出

    关闭防火墙:systemctl stop firewalld

    永久关闭防火墙:systemctl disable firewalld

2. 学习shell语法前必知必会

 2.1 shell脚本的语法规范

  一个合格的shell脚本应该按照以下格式书写:

    1):顶行标注解释环境  #!/bin/bash  或  #!/usr/bin/env bash

    2):该脚本信息,Author、Created time、Script Description(不能出现中文)

    3): 执行代码

#!/bin/bash
#Author: Bai Shuming
#Created Time: 2018/08/2712:27
#Script Description: first shell study script


#放要执行的代码...

  shell脚本开头必须指定脚本运行环境 以 #!这个特殊符号组合来组成。如: #!/bin/bash 指定该脚本是运行解析由/bin/bash来完成的

 2.1 如何运行一个脚本

  在子shell中运行,不影响当前shell

  1):给脚本文件赋予执行权限,chmod u+x filename,然后直接执行 ./opt/filename

  2):用bash命令来执行未被赋权的脚本,bash filename  或  sh filename

  在当前用户下运行另一个用户的脚本?

    su ossuser -c bash './opt/filename'

  在当前shell中运行,当前shell受影响

  在执行时候用source命令执行:source filename

 2.2 shell中的特殊符号

   不要和正则表达式中的符号含义搞混淆了。

    ~:                家目录    # cd ~ 代表进入用户家目录
    !:                执行历史命令   !! 执行上一条命令
    $:                变量中取内容符
    + - * \ %:       对应数学运算  加 减 乘 除 取余数  
    &:                后台执行
    *:                星号是shell中的通配符  匹配所有
    ?:                问号是shell中的通配符  匹配除回车以外的一个字符
    ;:               分号可以在shell中一行执行多个命令,命令之间用分号分割
    |:               管道符 上一个命令的输出作为下一个命令的输入   cat filename | grep "abc"
    \:                转义字符
    ``:               反引号 命令中执行命令    echo "today is `date +%F`"
    ' ':              单引号,脚本中字符串要用单引号引起来,但是不同于双引号的是,单引号不解释变量
    " ":              双引号,脚本中出现的字符串可以用双引号引起来

 2.3 shell的数学运算

  方法一: expr

expr 命令只能做整数运算,格式比较固定
[root@haha ~]# expr 5 + 5
10
[root@haha ~]# expr 5 - 2
3
[root@haha ~]# expr 5- 2       #注意格式错误
expr: 语法错误
[root@haha ~]# expr 5 \* 2    #注意要将*进行转义,否则认为是通配符
10
[root@haha ~]# expr 10 / 2
5
[root@haha ~]# expr 3 % 2
1


使用bc计算器处理浮点运算,scale=2表示小数点保留两位
[root@haha ~]# echo "scale=2;10/3"|bc
3.33
[root@haha ~]# echo "当前内存使用率为:`echo "scale=2;282*100/2018"|bc`%"
当前内存使用率为:13.97%

  方法二: $(())

  echo $((numb1+numb2))

在shell中,也可以使用$(()) 也可以作运算
[root@haha ~]# echo $((2 + 3))
5
[root@haha ~]# echo $((2 ** 3))
8
[root@haha ~]# echo $(((100+3)%2))
1

  方法三: $[]

[root@haha shell_0502]# echo $[2+5]
7
[root@haha shell_0502]# echo $[2*5]
10
[root@haha shell_0502]# echo $[(1+3)*2]
8

  方法四: let 运算

[root@haha shell_0503]# let sum=2+3;echo $sum
5
[root@haha shell_0503]# let sum++; echo $sum
6

  实现一个计算内存使用率的脚本

  基础版 

    注意: awk 后面跟单引号, 不能跟双引号$3 表示第3列,$(NF)表示最后一列,$(NF-1)表示倒数第二个

#!/bin/bash
# 内存的使用率

mem_used=`free -m | grep Mem | awk '{print $3}'`
mem_total=`free -m | grep Mem | awk '{print $2}'`
mem_use_ratio=$((mem_used * 100 / mem_total))

echo "当前内存使用率的百分比: $mem_use_ratio"

  加强版

#!/bin/bash
#内存超过80%就用日志记录一下

mem_use=`free -m | grep "Mem" | awk '{print $3}'`
mem_total=`free -m | grep "Mem" | awk '{print $2}'`
mem_use_percent=$((mem_use*100 / mem_total))
file_name="mem_warn.log"

if [ ! -e $file_name ]
  then
    touch $file_name
fi

if (( mem_use_percent >= 80 ))
  then
    echo "警告:请注意内存使用!"
    echo "`date +"%F %H:%M:%S"`的内存使用率为${mem_use_percent}%" >> $file_name
fi

 2.4 退出脚本

   在每条命令执行完之后,系统都会返回一个 exit num 表示该条命令的执行结果,一般0表示执行成功, 非0表示执行失败。可用 echo $? 查看上条命令的执行结果。

  exit  NUM 退出脚本, 释放系统资源, NUM为一个整数,代表返回值(在0-255之间,可以自定义)。

 2.5 shell输出(echo格式化输出)

   echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。

        echo "要显示的字符"

          注意:(单引号直接输出内部字符串,不解析特殊字符;双引号内则会解析特殊字符,包括 $、`、\ 等特殊符号

  语法:echo [-ne][字符串]

  命令选项:  

    -n:不要在最后自动换行

    -e:若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出

    转义字符  

      \a发出警告声;

      \b删除前一个字符(手写一个倒计时脚本可以用到);  

      \t插入tab;

      \c最后不加上换行符号;

      \n换行且光标移至行首;

      \r光标移至行首,但不换行;

      \v与\f相同; \插入\字符;

      \nnn插入nnn(八进制)所代表的ASCII字符;

[root@haha snd]# echo -e "\a\a\a\a\a\a"        # 发出警告声

[root@haha snd]# echo -e "he\bllo"      # 删除 \b 前面的字符e
hllo
[root@haha snd]# echo -e "hello\tworld"     # helloworld中间加一个tab
hello    world

   练习一个倒计时脚本:

#!/bin/bash
for time in `seq 9 -1 0`; do
    echo -n -e "\b$time"
    sleep 1
done

echo

  echo显示内容带颜色,需要使用 -e 参数,格式如:echo -e "\033[文字背景颜色;文字颜色m 字符串\033[0m",例如 echo -e "\033[41;36m something here \033[0m"

下面是相应的字和背景颜色,可以自己来尝试找出不同颜色搭配

  例
  echo -e “\033[31m 红色字 \033[0m”
  echo -e “\033[34m 黄色字 \033[0m”
  echo -e “\033[41;33m 红底黄字 \033[0m”
  echo -e “\033[41;37m 红底白字 \033[0m”
  
字颜色:30—–37
  echo -e “\033[30m 黑色字 \033[0m”
  echo -e “\033[31m 红色字 \033[0m”
  echo -e “\033[32m 绿色字 \033[0m”
  echo -e “\033[33m 黄色字 \033[0m”
  echo -e “\033[34m 蓝色字 \033[0m”
  echo -e “\033[35m 紫色字 \033[0m”
  echo -e “\033[36m 天蓝字 \033[0m”
  echo -e “\033[37m 白色字 \033[0m”

  
字背景颜色范围:40—–47
  echo -e “\033[40;37m 黑底白字 \033[0m”
  echo -e “\033[41;37m 红底白字 \033[0m”
  echo -e “\033[42;37m 绿底白字 \033[0m”
  echo -e “\033[43;37m 黄底白字 \033[0m”
  echo -e “\033[44;37m 蓝底白字 \033[0m”
  echo -e “\033[45;37m 紫底白字 \033[0m”
  echo -e “\033[46;37m 天蓝底白字 \033[0m”
  echo -e “\033[47;30m 白底黑字 \033[0m”
  
最后面控制选项说明
  \033[0m 关闭所有属性
  \033[1m 设置高亮度
  \033[4m 下划线
  \033[5m 闪烁
  \033[7m 反显
  \033[8m 消隐

  \033[30m — \33[37m 

设置前景色
  \033[40m — \33[47m 设置背景色
  \033[nA 光标上移n行
  \033[nB 光标下移n行
  \033[nC 光标右移n行
  \033[nD 光标左移n行
  \033[y;xH设置光标位置
  \033[2J 清屏
  \033[K 清除从光标到行尾的内容
  \33[s 保存光标位置
  \033[u 恢复光标位置
  \033[?25l 隐藏光标
  \033[?25h 显示光标 

 2.6 shell输入(read交互输入)

  当脚本程序执行到read命令时,程序由 running 状态变为 sleep 状态, 等待用户从键盘输入, 直到用户敲下 Enter 键,程序才继续往下走。

    语法:read [-stnp]

    read 命令选项:

    -s:不显示

    -t:限定时间

    -n:限定输入字符个数

    -p:打印信息

[root@haha shell_0407]# read
xiaoming
[root@haha shell_0407]# read -n2     # 2s不输入自动退出
[root@haha shell_0407]# read -s    # 不显示输入内容
[root@haha shell_0407]# read -s passwd; echo $passwd    # 将用户输入的内容赋值给变量passwd, 并echo查询
123123
[root@haha shell_0407]# read -n6 user    # 显示user为6位
xiaomi[root@haha shell_0407]# 
[root@haha shell_0407]# read -p "Login: " user    # 显示信息,并将用户输入的信息赋值给变量user
Login: xiaoming
[root@haha shell_0407]# echo "Login: $user"
Login: xiaoming

  练习不校验用户名和密码的登录脚本

#!/bin/bash
clear

echo "Centos Liinux 7 (Core)"
echo -e "Kernel `uname -r` an `uname -m`\n"

read -p "$HOSTNAME login: " account
read -s -p "password: " password
echo
posted @ 2020-04-08 00:08  恐水的鱼  Views(216)  Comments(0Edit  收藏  举报