shell 注意點 02

# shell用法

### 文件表達式

```shell
-e filename 如果 filename存在,則爲真
-d filename 如果 filename爲目錄,則爲真 
-f filename 如果 filename爲常規文件,則爲真
-L filename 如果 filename爲符號鏈接,則爲真
-r filename 如果 filename可讀,則爲真 
-w filename 如果 filename可寫,則爲真 
-x filename 如果 filename可執行,則爲真
-s filename 如果文件長度不爲0,則爲真
-h filename 如果文件是軟鏈接,則爲真
filename1 -nt filename2 如果 filename1比 filename2新,則爲真。
filename1 -ot filename2 如果 filename1比 filename2舊,則爲真。
```

### 整數變量表達式

```shell
-eq 等於
-ne 不等於
-gt 大於
-ge 大於等於
-lt 小於
-le 小於等於
```

### 字符串變量表達式

```shell
if  [ a = b ]   如果string1等於string2,則爲真
                字符串允許使用賦值號做等號
if  [ string1 !=  string2 ]  如果string1不等於string2,則爲真    
if  [ -n string  ]       如果string 非空(非0),返回0(true)  
if  [ -z string  ]       如果string 爲空,則爲真
if  [ $sting ]          如果string 非空,返回0 (和-n類似) 
```

### 邏輯運算符

```shell
邏輯非 !          條件表達式的相反
if [ ! 表達式 ]
if [ ! -d $num ]  如果不存在目錄$num,這個就相當於這條命令 test ! -d $num

邏輯與 –a          條件表達式的並列
if [ 表達式1  –a  表達式2 ]

邏輯或 -o          條件表達式的或
if [ 表達式1  –o 表達式2 ]
```

### 括號的用途

```shell
# 在使用if語句時,經常會使用(), (()),[],[[]],{}等恐懼哦好,如下爲幾種括號間的區別對比:
():用於多個命令組,命令替換,初始化數組
(()):整數擴展,運算符,重定義變量值,算術運算比較
[]:bash內部命令,與test是等同的,正則字符範圍,引用數組元素編號,不支持+-*/數學運算符,
邏輯測試使用-a,-o,[]就是test命令
[[]]:bash程序語言的關鍵字,不是一個命令,[[]]結構比[]結構更加通用,不支持+-*/數學運算符,
邏輯測試使用&&,||,!
{}:主要用於命令集合或者範圍,例如mkdir -p /data/201{7,8}

# 注意點
$()與`` 是一樣的,表示執行裏面的命令,注意裏面的前後空格的問題
echo $( date +%F ); echo `date +%F`
```

### man查看幫助文檔

```shell
man ssh  # 查看ssh幫助文檔
```

### exit的用法

```shell
#!/bin/bash
if [[ $1 -eq 1 ]];then
        echo 'hello world'
         # exit返回的整數是給$?使用的,表示退出了
        exit 66
else
        echo 'hello text'
        # exit返回的整數是給$?使用的
        exit 77
fi

./1.sh 1;echo $?;  # 結果爲:66
./1.sh 2;echo $?;  # 結果爲:77
```

### echo 顏色

```shell
# 字顏色: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" 
```

### date時間

```shell
date +%Y%m%d %H%M%S  
```

### 快捷鍵

```shell
ctrl+a  # 光標最前面
ctrl+e  # 後
```

### 注意點

```shell
# 變量建議使用""
例如:
SQL_DIR="/data/"
SQL_DUMP="${SQL_DIR}/dump/"

# set -e
寫的每個腳本都應該在文件開頭加上set -e,這句語句告訴bash如果任何語句的執行結果不是true則應該退出
```

# 實戰腳本

### 備份數據庫腳本

```shell
#!/bin/bash
#sj
#dump hadoop01 sql
#By author zby
##################
SQL_CMD="/usr/bin/mysqldump"
SQL_HOST="172.20.10.13"
SQL_PORT=3306
SQL_USERNAME="root"
SQL_PASSWORD="Mysql123!"
SQL_DUMP_DIR="./`date +%F`"
DATABASE_NAMES=$*

if [ ! -d $SQL_DUMP_DIR ];then
        echo -e '\033[33m-------------------------------------------------\033[0m'
        echo -e '\033[32m create sql dump dir\033[0m'
        echo -e '\033[33m------------------------------------------------\033[0m'
        mkdir -p $SQL_DUMP_DIR
fi

for DB_NAME in $DATABASE_NAMES
do
# dump da bash
$SQL_CMD -h$SQL_HOST -P$SQL_PORT -u$SQL_USERNAME -p$SQL_PASSWORD --databases $DB_NAME > ${SQL_DUMP_DIR}/${DB_NAME}dump.sql

if [ $? -eq 0 ];then
        echo -e '\033[33m-----------------------------------------------\033[0m'
        echo -e '\033[32m dump sql success \033[0m'
        echo -e '\033[33m-------------------------------------------------\033[0m'
else
        echo -e '\033[33m-------------------------------------------------\033[0m'
        echo -e '\033[31m dump sql failed, please check dump script  \033[0m'
        echo -e '\033[33m--------------------------------------------------\033[0m'
        # error exit
        exit 1
fi
done
```

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章