文章目錄
1. Shell 概述
- Shell 是一個命令行解釋器,接收應用程序/用戶命令,調用操作系統內核
- Shell 也是一種編程語言,易編寫、易調試、靈活性強
2. Shell 腳本入門
-
腳本格式
腳本以
#!/bin/bash
開頭(指定 Shell 的解析器) -
helloworld
需求:創建 Shell 腳本,輸出 helloworld
-
編寫腳本
root@iZwz9guplfkml2vvggil90Z:~# vi helloworld.sh #!/bin/bash echo "helloworld"
-
執行腳本
-
使用 bash 命令
root@iZwz9guplfkml2vvggil90Z:~# bash helloworld.sh helloworld
-
直接執行
# 賦予腳本可執行權限 root@iZwz9guplfkml2vvggil90Z:~# chmod 777 helloworld.sh # 執行腳本 root@iZwz9guplfkml2vvggil90Z:~# ./helloworld.sh helloworld
-
-
-
多命令處理
需求:在 /root 目錄下創建 ddd 文件,在 ddd 文件中增加 “I’m ddd”
root@iZwz9guplfkml2vvggil90Z:~# vi ddd.sh #!/bin/bash cd /root touch ddd echo "I'm ddd" >> ddd
3. Shell 中的變量
1. 系統變量
# $HOME,輸出家目錄
root@iZwz9guplfkml2vvggil90Z:~# echo $HOME
/root
# $PWD,輸出當前路徑
root@iZwz9guplfkml2vvggil90Z:/opt# echo $PWD
/opt
# $SHELL,輸出當前Shell解析器所在位置
root@iZwz9guplfkml2vvggil90Z:~# echo $SHELL
/bin/bash
# $USER,輸出當前用戶名
root@iZwz9guplfkml2vvggil90Z:~# echo $USER
root
2. 自定義變量
-
基本語法
#定義變量:變量=值 root@iZwz9guplfkml2vvggil90Z:~# c=2 #撤銷變量:unset 變量 root@iZwz9guplfkml2vvggil90Z:~# unset c #聲明靜態變量:readonly 變量,注意靜態變量不能被 unset root@iZwz9guplfkml2vvggil90Z:~# readonly w=2 #使用變量:$變量名字 root@iZwz9guplfkml2vvggil90Z:~# echo $w 2
-
變量定義規則
-
變量名可以由字母、數字和下劃線組成,但是不能以數字開頭,環境變量建議大寫
-
等號兩側不能有空格
root@iZwz9guplfkml2vvggil90Z:~# c = 2 c: command not found root@iZwz9guplfkml2vvggil90Z:~# c= 2 2: command not found root@iZwz9guplfkml2vvggil90Z:~# c =2 c: command not found
-
變量默認爲字符串類型,無法直接進行數值計算
root@iZwz9guplfkml2vvggil90Z:~# h=1+2 root@iZwz9guplfkml2vvggil90Z:~# echo $h 1+2
-
變量的值如果有空格,需要使用雙引號或單引號括起來
root@iZwz9guplfkml2vvggil90Z:~# h=h h h h: command not found root@iZwz9guplfkml2vvggil90Z:~# h="h h h" root@iZwz9guplfkml2vvggil90Z:~# echo $h h h h
-
3. 特殊變量
1. $n
$n,n爲數字,$0代表該腳本名稱,$1~$9代表第一到第九個參數,十以上的參數需要大括號括起來,如${10}
root@iZwz9guplfkml2vvggil90Z:~# vi para.sh
#!/bin/bash
echo "$0 $1 $2"
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh p1 p2
para.sh p1 p2
2. $#
$#,獲取所有輸入參數個數
root@iZwz9guplfkml2vvggil90Z:~# vi para.sh
#!/bin/bash
echo $#
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh s1
1
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh s1 s2 s3
3
3. $*、$@
- $*:代表命令行中所有的參數,把所有參數看成一個整體
- $@:代表命令行中所有的參數,但是把每個參數區分看待
root@iZwz9guplfkml2vvggil90Z:~# vi para.sh
#!/bin/bash
echo $*
echo $@
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh s1 s2 s3
s1 s2 s3
s1 s2 s3
4. $?
$?,返回上一次執行的命令的返回狀態,值爲0,證明上一個命令執行正確,反之
root@iZwz9guplfkml2vvggil90Z:~# echo $w
2
# 上一個命令執行成功,返回 0
root@iZwz9guplfkml2vvggil90Z:~# echo $?
0
root@iZwz9guplfkml2vvggil90Z:~# h = 22
h: command not found
# 上一個命令執行失敗,返回非 0
root@iZwz9guplfkml2vvggil90Z:~# echo $?
127
4. 運算符
- $((運算式)) 或 $[運算式]
- expr 表達式1 +,-,\*,/,% 表達式2
# 計算2+3
root@iZwz9guplfkml2vvggil90Z:~# echo $((2+3))
5
# 計算3-2
root@iZwz9guplfkml2vvggil90Z:~# echo $[3-2]
1
# 計算 2*3,注意空格
root@iZwz9guplfkml2vvggil90Z:~# expr 2 \* 3
6
# expr 計算 (2+3)*4
root@iZwz9guplfkml2vvggil90Z:~# expr `expr 2 + 3` \* 4
20
# $[] 計算 (2+3)*4
root@iZwz9guplfkml2vvggil90Z:~# echo $[(2+3)*4]
20
5. 條件判斷
-
基本語法:
[ condition ],[] 返回 false
注意:condition 前後都有空格
-
常用判斷條件
- 兩個整數之間比較
- -lt 小於(less than)
- -le 小於等於(less equal)
- -eq 等於(equal)
- -gt 大於(greater than)
- -ge 大於等於(greater equal)
- -ne 不等於(Not equal)
- 按照文件權限進行判斷
- -r 有讀的權限(read)
- -w 有寫的權限(write)
- -x 有執行的權限(execute)
- 按照文件類型進行判斷
- -f 文件存在並且是一個常規的文件(file)
- -e 文件存在(existence)
- -d 文件存在並是一個目錄(directory)
- 兩個整數之間比較
-
案例實操
&& 表示前一條命令執行成功時,才執行後一條命令,|| 表示上一條命令執行失敗後,才執行下一條命令
#23 是否大於等於 22 root@iZwz9guplfkml2vvggil90Z:~# [ 23 -ge 22 ] && echo "true" || echo "false" true #para.sh 是否具有寫權限 root@iZwz9guplfkml2vvggil90Z:~# [ -w para.sh ] && echo "true" || echo "false" true #/root/shell/ccc.txt 文件是否存在 root@iZwz9guplfkml2vvggil90Z:~# [ -f /root/shell/ccc.txt ] && echo "true" || echo "false" false
6. 流程控制
1. if
基本語法:
if [ 條件判斷式1 ]
then
#do something..
elif [ 條件判斷式2 ]
then
#do something..
else
#do something..
fi
注意事項:
- if 後必須有空格
- [ 條件判斷式 ],中括號和條件判斷式之間必須有空格
- then 寫 [ 條件判斷式 ] 中間一定加 ;
# 輸入一個數字,如果是1,輸出"1";如果是2,輸出"2",如果是其他,什麼也不輸出
root@iZwz9guplfkml2vvggil90Z:~# vi if
#!/bin/bash
if [ $1 -eq 1 ]
then
echo "1"
elif [ $1 -eq 2 ]
then
echo "2"
fi
root@iZwz9guplfkml2vvggil90Z:~# bash if 2
2
root@iZwz9guplfkml2vvggil90Z:~# bash if 1
1
2. case
基本語法:
case $變量名 in
"值1")
#do something..
;;
"值2")
#do something..
;;
....
*)
#do something..
;;
esac
注意事項:
- case 行尾必須爲 in
- 每一種模式匹配以 ) 結束
- ;; 相當於 Java 中的 break
- *) 表示默認模式,相當於 Java 中的 default
# 輸入一個數字,如果是1,輸出"1";如果是2,輸出"2",如果是其他,輸出"666"
root@iZwz9guplfkml2vvggil90Z:~# vi case
#!/bin/bash
case $1 in
1)
echo "1"
;;
2)
echo "2"
;;
*)
echo "666"
;;
esac
root@iZwz9guplfkml2vvggil90Z:~# bash case 1
1
root@iZwz9guplfkml2vvggil90Z:~# bash case 2
2
root@iZwz9guplfkml2vvggil90Z:~# bash case 3
666
3. for
基本語法1:
for((初始值;循環控制條件;變量變化))
do
#do something...
done
# 從1加到100
sdbserver1:~ # vi loop.sh
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
sdbserver1:~ # bash loop.sh
5050
基本語法2:
for 變量 in 值1 值2...
do
#do something...
done
# 從1加到100
sdbserver1:~ # vi loop.sh
#!/bin/bash
s=0
for i in {1..100}
do
s=$[$s+$i]
done
echo $s
sdbserver1:~ # bash loop.sh
5050
4. while
基本語法:
while [ 條件判斷式 ]
do
#do something...
done
# 從1加到100
sdbserver1:~ # vi while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$i+$s]
i=$[$i+1]
done
echo $s
sdbserver1:~ # bash while.sh
5050
參考資料: