shell script

一 什麼是shell script

  將OS命令堆積到可執行的文件裏,由上至下的順序執行文本里的OS命令 就是腳本了.
  再加上些智能(條件/流控)控制,就變成了智能化腳本了.node

二 變量

part1 爲什麼要有變量sql

程序的運行就是一些列狀態的變量->用變量值的變化去表示shell

part2 變量命名規則express

以字母或下劃線開頭,剩下的部分能夠是:字母、數字、下劃線.bash

最好遵循下述規範:測試

1.以字母開頭
2.使用中劃線或者下劃線作單詞的鏈接
3.同類型的用數字區分
4.對於文件最好加上拓展名
例如: sql_bak.tar.gz,log_bak.tar.bz2 ui

part3 系統變量spa

set 和 env區別
set:顯示全部變量
env:顯示全部環境變量,環境變量變量名都是大寫字母命令行

part4 變量賦值rest

VARNAME=VALUE
echo $VARNAME
刪除變量 unset VARNAME

part5 經常使用系統變量

PATH
PWD:記錄當前路徑
LANG
HOME:當前登陸用戶的家目錄
HISTSIZE:設定記錄的歷史命令行數
PS1:設定命令提示符的形式
IFS
域分隔符 是空格,換行,TAB鍵的合集

part6 全局變量與局部變量

用戶自定義的變量分爲局部變量和全局變量

[root@MiWiFi-R3-srv ~]# gender='male' #在爹這個位置定義一個局部變量gender
[root@MiWiFi-R3-srv ~]# export money=1000 #在爹這個位置定義一個全局變量money
[root@MiWiFi-R3-srv ~]#
[root@MiWiFi-R3-srv ~]#
[root@MiWiFi-R3-srv ~]# bash #切換到子bash
[root@MiWiFi-R3-srv ~]# echo $gender #在兒子這裏看它爹的局部變量gender,結果爲空->看不到

[root@MiWiFi-R3-srv ~]# echo $money #在兒子這裏看它爹的全局變量money,能夠看到
1000
[root@MiWiFi-R3-srv ~]#
[root@MiWiFi-R3-srv ~]# export hobby='piao' #在兒子這裏定義一個全局變量hobby
[root@MiWiFi-R3-srv ~]# exit #退出,進入爹的bash環境
exit
[root@MiWiFi-R3-srv ~]# echo $hobby #爹是看不到兒子的export的,兒子的兒子能夠看到

[root@MiWiFi-R3-srv ~]#

part6 定義變量名的邊界

[root@MiWiFi-R3-srv ~]# rest_mem=20
[root@MiWiFi-R3-srv ~]# echo ${rest_mem}%
20%

part 7 數據類型

bash中的變量無須聲明,拿來就用.默認的變量都會是字符類型,還能夠有數字類型,普通的腳本,這兩種類型夠用了

三 運算符

part1 算術運算符

+

-

*

/

%

[root@MiWiFi-R3-srv ~]# echo $[3+1]
4

part2 關係操做

與(())連用,(())裏不須要用取值符號

<

>

<=

>=

==

!=

&&

||

test命令相關,[]能夠達到同樣的效果
[root@MiWiFi-R3-srv ~]# x=1
[root@MiWiFi-R3-srv ~]# [ $x -gt 1 ]
[root@MiWiFi-R3-srv ~]# echo $?
0

part3 賦值運算符

=

+=

*=

/=

%=

[root@MiWiFi-R3-srv ~]# x=10
[root@MiWiFi-R3-srv ~]# ((x%3))
[root@MiWiFi-R3-srv ~]# echo $x
10
[root@MiWiFi-R3-srv ~]#
[root@MiWiFi-R3-srv ~]# ((x%=3))
[root@MiWiFi-R3-srv ~]# echo $x
1

part4 shell裏的全部計算器
$[] (()) $(()) expr bc bc -l

[root@myworld ~]# expr 1 + 2
3

浮點運算:yum install bc -y

[root@MiWiFi-R3-srv ~]# echo 'scale=2;1/3'|bc -l
.33

用浮點數表示內存的使用率:

[root@myworld ~]# free
              total        used        free      shared  buff/cache   available
Mem:         999696      268152      378804        7444      352740      548900
Swap:       2097148           0     2097148
[root@myworld ~]# mem_use=`free | awk 'NR==2{print $6}'`
[root@myworld ~]# mem_total=`free | awk 'NR==2{print $2}'`

[root@myworld ~]# x=`echo "scale=2;$mem_use/$mem_total"|bc -l | cut -d. -f2`
[root@myworld ~]# echo ${x}%
38%

part5 測試操做

命令執行後會返回到一個系統變量中 $?
若是$?值爲0 表示命令執行成功 不然爲失敗


測試命令 test [ ] [[ ]] (( ))
打開man test 逐一介紹每一個參數
part5-一、測試文件狀態
-d 目錄
-s 文件長度 > 0、非空
-f 正規文件
-w 可寫

-r 可讀

-x 可執行

-L 符號鏈接

-u 文件有 suid 位設置

part5-二、字符串測試
= 兩個字符串相等
!= 兩個字符串不相等
-z 空串
-n 非空串

[root@MiWiFi-R3-srv ~]# var1='abc'
[root@MiWiFi-R3-srv ~]# var2='123'
[root@MiWiFi-R3-srv ~]# [ $var1 == $var2 ]
[root@MiWiFi-R3-srv ~]# echo $?
1

part5-三、測試數值
-eq 等於
-ne 不等於
-gt 大於
-lt 小於
-ge 大於等於
-le 小於等於

[root@MiWiFi-R3-srv ~]# [ 10000 -gt 250 ] #不要使用大於號小於號等於號等,要使用man test中規定的,詳見下一小節4拓展
[root@MiWiFi-R3-srv ~]# echo $?
0

part5-四、拓展測試符號 [[ ]] (())
數字測試符號
# [ 10 < 2 ] # 語法錯誤
-bash: 2: 沒有那個文件或目錄
#

# [[ 2 > 10 ]] # 結果錯誤
# echo $?
0
# [[ 20 > 10 ]] # 正確
# echo $?
0
# (( 10 < 20 ))
# echo $?
0

字符測試
# [ "aa" = "aa" ]
# echo $?
0
# [[ "aa" = "aa" ]]
# echo $?
0
# (( "aa" = "aa" )) #結果錯誤
# echo $?
1
混合測試
# [ a = a -a 10 < 20 ]
-bash: 20: 沒有那個文件或目錄
[root@seker ~]# [[ a = a -a 10 < 20 ]]
-bash: syntax error in conditional expression
-bash: syntax error near `-a'
[root@seker ~]# [[ a = a && 10 < 20 ]]
[root@seker ~]# echo $?
0
[root@seker ~]# [[ a = a || 10 < 20 ]]
[root@seker ~]# echo $?
0
[root@seker ~]# (( a = a || 10 < 20 ))
[root@seker ~]# echo $?
0
[root@seker ~]# (( a = a && 10 < 20 ))
[root@seker ~]# echo $?
0
[root@seker ~]#
結論:
比較數字,使用(( ))
其餘測試使用 [[ ]]
包含數字比較的混合測試,使用[[ expr1 && expr2 ]] (( expr1 || expr2 ))

兩個文件的比較
FILE1 -ef FILE2
測試兩個文件是不是相同的inode
有時爲了找到同一個INODE號的文件 更傾向於使用 find 命令的 -inum 或 --samefile

FILE1 -nt FILE2
FILE1 is newer (modification date) than FILE2

FILE1 -ot FILE2 FILE1 is older than FILE2

相關文章
相關標籤/搜索