一:shell腳本基礎(chǔ)
1.shell命令 : 在linux終端能夠被解析出來的命令
2.shell腳本 : 多個shell命令的集合, 邏輯判斷, 循環(huán), 函數(shù), 變量
二:shell命令被解析的過程:
1.有一個解析命令的進(jìn)程: bash(linux)/shell(unix)
2.bash解析過程, 監(jiān)測終端輸入, 有回車的時候輸入完成, bash檢測環(huán)境變量PATH (有多個路徑), bash從前往后依次遍歷每個路徑, 檢測各個路徑中有沒有用戶輸入的命令, 如果找到了, 執(zhí)行該路徑下的命令, 如果沒找到找下一個, 最后還是沒找到, 提示這個命令無法解析
三:shell腳本的基本格式:
1.命名格式
shell腳本是一個文件, 命令方式: xxx.sh
.sh的后綴不是必須的, 目的是為了方便識別
2.書寫格式
(1).第一行是固定的, 指定解析腳本內(nèi)容使用的命令解析器:#! /bin/bash (指令使用的命令解析器是bash), 這行可以省略
(2).后邊就是shell命令, 變量定義, 函數(shù)調(diào)用, 邏輯判斷循環(huán)
四:shell腳本的執(zhí)行
1.文件訪問者:
擁有者u——-user
所屬組g——-group
其他用戶o—–other
2.文件訪問權(quán)限的種類:
可讀(r) 可寫(w) 可執(zhí)行(x)
3.目錄初始默認(rèn)權(quán)限為 : 775(八進(jìn)制), 111 111 101(二進(jìn)制),-rwxrwxr-x 1 root root
文件初始默認(rèn)權(quán)限為: 644(八進(jìn)制), 110 110 100(二進(jìn)制),-rw-rw-r-- 1 root root
腳本文件需要執(zhí)行權(quán)限:
chmod u+x xxx.sh //u:當(dāng)前文件所有者 + x執(zhí)行權(quán)限
chmod a+x xxx.sh //a:當(dāng)前文件所有者所有組的人 + x執(zhí)行權(quán)限
chmod 777 xxx.sh
4.腳本文件的執(zhí)行
./xxx.sh 和執(zhí)行可執(zhí)行程序一樣,最常用
sh xxx.sh 也可以執(zhí)行xxx.sh腳本
五:shell腳本中的變量
echo shell命令:表示輸出
1.普通變量(本地變量)
//變量名=變量值 (默認(rèn)字符串類型)
hello=123
//在shell中定義變量的時候, 必須初始化,=前后不能有空格,普通變量名小寫
2.環(huán)境變量(一般大寫)
//export 環(huán)境變量名=值 或 set 環(huán)境變量名=值
export GOROOT=/usr/local/go
export GOROOT=$HOME/go
//環(huán)境變量在全局范圍內(nèi)都可以使用
3.位置變量和特殊變量
在執(zhí)行腳本文件的時候, 可以進(jìn)行參數(shù)傳遞, 在腳本內(nèi)部需要接收這些參數(shù), 這時候需要用到位置變量
$0:腳本的名字
$1:給shell腳本傳遞的第一個參數(shù),
$2:給shell腳本傳遞的第二個參數(shù),以此類推
$#: 給shell腳本傳遞的參數(shù)的個數(shù)
$@: 給shell腳本傳遞的所有參數(shù)的集合
$$: shell腳本開始執(zhí)行,產(chǎn)生的進(jìn)程ID
$?: 進(jìn)程執(zhí)行狀態(tài)(在腳本中沒法體現(xiàn),因?yàn)樾枰M(jìn)程執(zhí)行完,才能查看進(jìn)程執(zhí)行狀態(tài)),腳本執(zhí)行完成后,在命令行中查看
- 0 表示成功
- 非0 表示失敗
編寫腳本文件:vi position.sh
腳本代碼:
#! /bin/bash
ls
echo "腳本的名字 = " $0
echo "第1個參數(shù) = " $1
echo "第2個參數(shù) = " $2
echo "第3個參數(shù) = " $3
echo "第4個參數(shù) = " $4
echo "第5個參數(shù) = " $5
echo "參數(shù)的個數(shù): " $#
echo "所有的參數(shù): " $@
echo "腳本執(zhí)行之后的進(jìn)程ID: " $$
執(zhí)行腳本,并傳遞參數(shù)以及執(zhí)行結(jié)果:
4.取值
(1)取普通變量的值
$變量名
${變量名}
(2)取命令執(zhí)行之后的結(jié)果值
str=$(shell命令)
str=`shell命令`
5.引號的使用
(1)雙引號:加雙引號和不加是一樣的
如果是字符串, 原樣輸出
如果是待解析的指令, 會將其解析
(2)單引號:
如果是字符串, 原樣輸出
如果是待解析的指令, 不會解析, 原樣輸出
6.shell腳本中的if條件判斷
注意事項(xiàng):
if和[]之間有空格
[]和條件判斷前后有空格
if [ 條件判斷 ];then
處理指令(shell命令)
fi
if [ 條件判斷 ]
then
處理指令(shell命令)
fi
if [ 條件判斷 ];then
處理指令(shell命令)
elif [ 條件判斷 ];then
處理指令(shell命令)
else
處理指令(shell命令)
fi
shell條件測試參考:
例:給腳本傳參, 文件名, 在腳本中判斷這文件名對一個的文件是普通文件還是目錄
#! /bin/bash
# 取出文件名
filename=$1
# 判斷
if [ -d $filename ];then //當(dāng)pathname 存在并且是一個目錄時返回真
echo "$filename 是一個目錄!"
elif [ -s $filename ];then //當(dāng)filename 存在并且文件大小大于0 時返回真
echo "$filename 存在!!!"
else
echo "$filename 不存在, 或者文件為空"
fi
結(jié)果:
7.shell腳本中的for循環(huán)
語法: for 變量名 in 列表;do ... done
for num in 123 345 22 33 44 55;do
echo "$num"
done
for dir in $(ls);do
echo "$dir"
done
# 腳本內(nèi)容
#! /bin/bash
# 遍歷當(dāng)前目錄
for dir in `ls`;do
echo $dir
done
# 遍歷傳遞進(jìn)來的參數(shù)
for arg in $@;do
echo $arg
done
結(jié)果:
8.shell腳本中的函數(shù)
沒有函數(shù)修飾符, 沒參數(shù), 沒有返回值
沒有參數(shù)但是可以傳參數(shù), 在函數(shù)內(nèi)部取參數(shù)使用的是位置變量
可以得到返回值, 表示的函數(shù)的執(zhí)行狀態(tài), 0或非0
0 -> 成功
非0 -> 調(diào)用有問題
- 函數(shù)定義, 定義完成, 函數(shù)體不會執(zhí)行, 必須被調(diào)用
myfunc()
{
函數(shù)體
shell指令(for循環(huán), if語句等)
}
2.函數(shù)調(diào)用
函數(shù)名 [參1 參數(shù)2 參數(shù)3]
myfunc 11 22 33
例子代碼:
# 寫個函數(shù)判斷傳遞進(jìn)去的文件名是不是目錄, 如果存在什么也不干, 不存在, 創(chuàng)建
#! /bin/bash
# 定義函數(shù)
myfunc()
{
# 遍歷接收到的所有文件名
for name in $@;do
# 文件類型判斷
if [ -d $name ];then
echo $name 是一個目錄!
else
# 創(chuàng)建目錄
mkdir $name
# 判斷目錄是不是創(chuàng)建成功了
if [ $? -ne 0 ];then
echo "目錄創(chuàng)建失敗: $name"
else
echo " $name 創(chuàng)建成功..."
fi
fi
done
}
# 函數(shù)調(diào)用
myfunc a b c d e f g
結(jié)果: