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
相關文章
相關標籤/搜索