變量
變量的定義
變量名的命名槼則
字母、數字、下劃線
不以數字開頭
變量的賦值,不區分類型,等號兩側不允許出現空格
爲變量賦值的過程,稱爲變量替換
變量名=變量值
a=123
使用let爲變量賦值
let a=10+20
使用let可以計算等號右側的值
將命令賦值給變量
l=ls
將命令結果賦值給變量,使用$()或者``
letc=$(ls -l /etc)
將命令賦值給變量,通過訪問變量去執行命令可以節省系統資源開銷
變量值有空格等特殊字符可以包含在””或’’中
變量的引用
${變量名}稱作對變量的引用
echo ${變量名}查看變量的值
${變量名}在部分情況下可以省略大括號,例如變量名後面沒有跟其他字符的時候
變量的作用範圍
默認作用範圍
定義變量的當前shell
變量的導出
export 變量名
可以使變量在其父進程shell和子進程shell都生效
變量的刪除
unset 變量名
刪除變量
系統環境變量
環境變量配置文档
數組
定義數組
IPTS=( 10.0.0.1 10.0.0.2 10.0.0.3 )
顯示數組的所有元素
echo ${IPTS[@]}
顯示數組元素的個數
echo ${#IPTS[@]}
顯示數組的第一個元素
echo ${IPTS[0]}
運算符
賦值運算符
= 賦值運算符,用於算數賦值和字符串賦值
使用unset取消爲變量的賦值
= 除了作爲賦值運算符還可以作爲測試操作符
算數運算符
基本運算符
* + - * / ** %
使用expr進行運算
expr 4 + 5
符號左右要有空格,只支持整數,不支持浮點數
num=`expr 4 + 5`
數字常量
let “變量名=變量值”
變量值使用0開頭爲八進制
變量值使用0x開頭爲十六進制
雙圓括號
(( a=10 ))
(( a++ ))
echo $((10+20))
(( a=4+5 ))
test比較
退出與退出狀態
退出程序命令
exit
exit 10 返回10給shell,返回值非0爲不正常退出
$?判斷當前shell前一個進程是否正常退出
測試命令test
test命令用於檢查文档或者比較值
test可以做以下測試
文档測試
整數比較測試
字符串測試
test測試語句可以簡化爲[]符號
-z STRING
字符串長度爲0
STRING1 = STRING2
字符串相等,區分大小寫
STRING1 != STRING2
字符串不相等,區分大小寫
INTEGER1 -eq INTEGER2
整數1等於整數2
INTEGER1 -ge INTEGER2
整數1大於等於整數2,如果使用>=,需使用[[]]
INTEGER1 -gt INTEGER2
整數1大於整數2,如果使用>,需使用[[]]
INTEGER1 -le INTEGER2
整數1小於等於整數2,如果使用<=,需使用[[]]
INTEGER1 -lt INTEGER2
整數1小於整數2,如果使用<,需使用[[]]
INTEGER1 -ne INTEGER2
整數1不等於整數2
-e FILE
文档存在,不區分文档和目錄
-d FILE
文档存在並且是一個目錄
-f FILE
文档存在並且是一個普通文档
[]符號還有擴展寫法[[]]支持&&、||、<、>
使用if-then語句
if [ 測試條件成立 ] 或 命令返回值是否爲0
then 執行相應命令
fi 結束
代碼示例:
輸出root
[root@localhost ~]# if [ $UID = 0 ]
> then
> echo root
> fi
root
什麽也沒有輸出
[root@localhost ~]# su - vagrant Last login: 二 10月 22 02:11:36 UTC 2019 from 10.0.2.2 on pts/0 [vagrant@localhost ~]$ if [ $UID = 0 ] > then > echo root > fi
執行
[vagrant@localhost ~]$ if pwd > then > echo success > fi /home/vagrant success
未執行
[vagrant@localhost ~]$ if pwd1
> then
> echo success
> fi
-bash: pwd1: command not found
使用if-then-else語句
使用if-then-else語句可以在條件不成立時也運行相應的命令
if [ 測試條件成立 ]
then 執行相應命令
else 測試條件不成立,執行相應命令
fi 結束
代碼示例:
root用戶
[root@localhost ~]# if [ $USER = root ] ; then > echo root user > echo $UID > else > echo other user > echo $UID > fi root user 0
普通用戶
[root@localhost ~]# su - vagrant Last login: Wed Oct 23 03:59:20 UTC 2019 on pts/0 [vagrant@localhost ~]$ if [ $USER = root ] ; then > echo root user > echo $UID > else > echo other user > echo $UID > fi other user 1000
使用if-then-elif-then-else語句可以在條件不成立時也運行相應的命令
if [ 測試條件成立 ]
then 執行相應命令
elif [ 測試條件成立 ]
then 執行相應命令
else 測試條件不成立,執行相應命令
fi 結束
[vagrant@localhost ~]$ if [ $USER = root ] ; then > echo root user > echo $UID > elif [ $USER = vagrant ] ; then > echo vagrant user > echo $UID > else > echo other user > echo $UID > fi vagrant user 1000
嵌套if語句
if條件測試中可以再嵌套if條件測試
if [ 測試條件成立 ]
then 執行相應命令
if [ 測試條件成立 ]
then 執行相應命令
fi
fi 結束
代碼示例:
[vagrant@localhost ~]$ if [ $USER = root ] ; then > echo root user > echo $UID > else > if [ $USER = vagrant ] ; then > echo vagrant user > echo $UID > fi > echo other user > fi vagrant user 1000 other user
分支
case 語句和select 語句可以構成分支
case “$變量” in
“情況1” )
命令…
;;
“情況2” )
命令…
;;
*)
命令…
;;
esac
代碼示例:
#!/bin/bash # demo case "$1" in "START" | "start") echo $0 start... ;; "stop") echo $0 stop... ;; "restart" | "reload") echo $0 restart... ;; *) echo "Usage: $0 {start | stop | restart | reload}" ;; esac
循環
使用 for 循環遍歷命令的執行結果
for 循環的語法
for 參數 in 列表
do 執行的命令
done 封閉一個循環
使用反引號或$()方式執行命令,命令的結果當做列表進行處理
使用 for 循環遍歷變量和文档的内容
列表中包含多個變量,變量用空格分隔
對文本處理,要使用文本查看命令取出文本内容
默認逐行處理,如果文本出現空格會當做多行處理
代碼示例:
[root@localhost ~]# touch a.mp3 b.mp3 c.mp3 [root@localhost ~]# for filename in `ls *.mp3` > do > mv $filename $(basename $filename .mp3).mp4 > done
C 語言風格的 for 循環
for ((變量初始化;循環判斷條件;變量變化))
do
循環執行的命令
done
代碼示例:
[root@localhost ~]# for ((i=1;i<=10;i++)) > do > echo $i > done
while 循環
while test測試是否成立
do
命令
done
代碼示例:
[root@localhost ~]# while [ a -lt 10 ] do (( a++ )) echo $a done 1
死循環
代碼示例:
[root@localhost ~]# while :
> do
> echo hello
> done
until 循環
until 循環與 while 循環相反,循環測試爲假時,執行循環,爲真時循環停止
代碼示例:
[root@localhost ~]# a=1 [root@localhost ~]# until [ $a -gt 5 ] > do > (( a++ )) > echo $a > done
break 和 continue 語句
循環的使用
循環和循環可以嵌套
循環中可以嵌套判斷,反過來也可以嵌套
循環可以使用break和continue語句在循環中退出
代碼示例:
break [root@localhost ~]# for a in {1..9} ; do > if [ $a eq 5 ] ; then > break > fi > echo $a > done continue [root@localhost ~]# for a in {1..9} ; do > if [ $a eq 5 ] ; then > continue > fi > echo $a > done
使用循環對命令行參數的處理
命令行參數可以使用 $1 $2 … ${10} … $n 進行讀取
$0 代表腳本名稱
$* 和 $@ 代表所有位置參數
$# 代表位置參數的數量
代碼示例:
#!/bin/bash # demo # for pos in $* # do # if [ "$pos" = "hello" ] ; then # echo $pos $pos # fi # done while [ $# -ge 1 ] do if [ "$1" = "hello" ] ; then echo $1 $1 fi shift done
函數
自定義函數
函數用於 ”包含“ 重複使用的命令集合
自定義函數
function fname(){ 命令 }
函數的執行
fname
函數作用範圍的變量
local 變量名
函數的參考
$1 $2 $3 … $n
代碼示例:
#!/bin/bash # demo checkpid() { local i for i in $* ; do [ -d "/proc/$i" ] && return 0 done return 1 }