# 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
```