shell脚本编写

1.shell 简单demo

shelldemo.shlinux

#!/bin/bash
#指定shell解析器
echo "hello shell"

执行shell的几种方式:redis

  • /bin/bash shelldemo.sh
  • /bin/sh shelldemo.sh
  • ./shelldemo.sh

前两种方式是使用bash和sh命令进行执行,第三种是直接执行shell脚本,若是shelldemo.sh在当前用户下没有执行权限,则会报没有权限执行。shell

查看linux提供的shell解析器:bash

cat /etc/shells

image.png

其中sh是bash的连接编辑器

####2.变量工具

  • 经常使用的系统变量
$HOME、$PWD、$SHELL、$USER,分别表明家目录,当前目录,shell执行解析器,当前用户名

image.png

  • 自定义变量spa

    声明变量:变量=值  #中间不能有空格
      撤销变量:unset 变量
      声明静态变量:readonly 变量,一个变量声明后被执行此命令后就不可以被改变值了
      变量默认是字符串类型的,不可以直接进行计算
      声明为全局变量: export 变量; export $PATH=/usr/local/kafka/bin:$PATH
  • 特殊变量rest

    $n: n是数字,$0表明脚本的名称,$1-9表明执行脚本的时候的参数。例如写shell中echo "$0 $1 $2"。
      $#: 获取执行脚本输入的参数的个数。
      $*: 全部参数
      $@: 全部参数,可是分开的
      $?: 上一次执行脚本的返回状态,若是为0的话则执行正确,不然执行不正确。

3.运算符,条件判断,循环

$((运算))或$[运算式]
expr +,-,\*,/,% ;运算符之间要有空格

```shell
expr 2 + 3    
expr 5 - 9    
S=$( (2+3)*4 )
echo $S
```

[ condition ]  条件判断

```shell
[ 3 -lt 9] true
[ zzu ] true
[ 3 -le 9 ] true
[ 3 -eq 9] false
[ 3 -gt 9 ] false
[ 3 -ge 9 ] false
[ 3 -ne 9 ] false
[ -r xxx.sh ] 是否有读权限
[ -w xxx.sh ] 是否有写权限
[ -x xxx.sh ] 是否有执行权限
[ -f xxx.sh ] 是不是个文件
[ -e xxx.sh ] 是否存在
[ -d xxx.sh ] 是不是个目录
&& 并
|| 或
```

条件判断
```
if [ 3 -eq 9 ];then
    echo "3==9"
fi
--------------------------------
if [ 3 -eq 9 ];then
    echo "3==9"
elif [ 3 -lt 9 ];then
    echo "3<9"
fi
```

case语句
```
case $1 in
    "start")
        echo "start redis"
    ;;
    "stop")
        echo "stop redis"
     ;;
     *)
        echo "no operator"
     ;;
 esac
```

for循环

```
for i in $*
    do 
        echo $i
    done
```

while循环
```
#/bin/bash
s=0
i=1
while [ $i -le 100 ] 
do
    s=$[$s+$i]
    i=$[$i+1]
done
echo $s
```

4.工具命令

  • cut
    cut:可将文件中文本的每一行以必定字符串的拆分红不一样的段,而后显示这些段code

    cut.txt文件内容
    ------------------------------
     yang_pu
     hong_kou
     bao_shan
     pu_dong
     pu_tuo
    ------------------------------
    
    cut命令的经常使用参数有-d -f 
    
    -d指定每行的分割符,分隔符只能有一个,
    -f指定显示的列
    
    cut -d "_" -f 1 cut.txt #指定分割符为_,只显示第一列

    image.png

    结果server

    image.png

  • sed

    sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并无改变,除非你使用重定向存储输出。

  • awk
    awk对文件以行进行读取,并以模式进行匹配,匹配后可获取特定的值。

    经常使用参数有
    -F 指定分割符

    使用awk获取以pu开头的行

image.png

####5.redis服务脚本

#!/bin/sh

EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/data/redis/redis.pid
CONF="/data/redis/redis.conf"
REDISPORT="16379"

case "$1" in
   start)
       if [ -f $PIDFILE ]
       then
           echo "$PIDFILE exists, process is already running or crashed"
       else
           echo "Starting Redis server..."
           $EXEC $CONF
       fi
       ;;
   stop)
       if [ ! -f $PIDFILE ]
       then
           echo "$PIDFILE does not exist, process is not running"
       else
           PID=$(cat $PIDFILE)
           echo "Stopping ..."
           $CLIEXEC -p $REDISPORT shutdown
           while [ -x /proc/${PID} ]
           do
               echo "Waiting for Redis to shutdown ..."
               sleep 1
           done
           echo "Redis stopped"
       fi
       ;;
   status)
       PID=$(cat $PIDFILE)
       if [ ! -x /proc/${PID} ]
       then
           echo 'Redis is not running'
       else
           echo "Redis is running ($PID)"
       fi
       ;;
   restart)
       $0 stop
       $0 start
       ;;
   *)
       echo "Please use start, stop, restart or status as first argument"
       ;;
esac