shell編程
Shell腳本,是一種為shell編寫的腳本程序。
Shell編程跟JavaScript、Python編程一樣,只要有一個(gè)能編寫代碼的文本編輯器和一個(gè)能解釋執(zhí)行的腳本解釋器就可以了。
Linux的Shell種類有很多,我們主要用的是Bourne Shell(/usr.bin/sh或/bin/sh)
1.創(chuàng)建shell文件
原則上shell程序可以寫在任何文件中,但是一般會(huì)在shell文件后加后綴.sh表示當(dāng)前文件是一個(gè)shell文件
shell需要可執(zhí)行權(quán)限,所以創(chuàng)建好的shell文件需要添加x權(quán)限
2.基礎(chǔ)語(yǔ)法
1)注釋
# 單行注釋
:<<EOF
多行注釋1
多行注釋2
多行注釋3
EOF
2)輸出和輸入
echo指令就相當(dāng)于python中的print函數(shù)(默認(rèn)會(huì)換行)
echo 輸出內(nèi)容
echo -n 輸出內(nèi)容 # 輸出的時(shí)候不換行
printf指令(輸出不能換行)
printf 輸出內(nèi)容
輸入指令:
read 變量名 -- 輸入內(nèi)容,并且將輸入的結(jié)果保存在變量中
3)變量
a. 聲明變量的語(yǔ)法: 變量名=值
說(shuō)明: a. 變量名和=, =和值之間不能有空格
? b. 變量名的要求和python變量名要求一樣
name='小明'
age=18
stu_name=小紅
b. 使用變量:
? {變量}
age=18
echo $age
age2=${age}
c. 只讀變量
使用 readonly 命令可以將變量定義為只讀變量,只讀變量的值不能被改變。
gender='男'
readonly gender
gender='女' # test.sh: line 17: gender: readonly variable
d. 刪除變量
使用 unset 命令可以刪除變量
name='yuting'
unset name
4)獲取linux指令結(jié)果
在shell腳本中可以直接寫linux指令,在執(zhí)行shell腳本的時(shí)候這些指令可以直接獲取
ls # ls指令
ls -lh # ls指令,并且設(shè)置參數(shù)
touch a.txt # 創(chuàng)建a.txt文件
# 獲取指令結(jié)果: 變量=$(指令) / 變量=`指令`
lsresult=$(ls) #將ls指令的結(jié)果保存到變量lsresult中
currnet_path=`pwd`
3.shell字符串
shell中的字符串可以用單引號(hào)也可以使用雙引號(hào)甚至可以不用引號(hào)。但是單引號(hào)中不能出現(xiàn)單引號(hào)字符,加\也不行
str1='abc'
str2="abc"
str3=abc
str4='abc\n123' #支持轉(zhuǎn)義字符,但是不支持編碼字符
str5="abc\n123"
age=18
str6="年齡是$age" #雙引號(hào)里面可以出現(xiàn)變量,單引號(hào)不行
1)字符串拼接
str1="hello"
#單引號(hào)拼接
str2=''${str1}',world!'
str3=''$str1',world!'
#雙引號(hào)拼接
str4="${str1},world!"
str5=""$str1",world!"
2)獲取字符串長(zhǎng)度
str1="abcd"
echo ${#str1} # 輸出4
3)字符串提取
# 字符串:下標(biāo):個(gè)數(shù) --從字符串中指定下標(biāo)開(kāi)始獲取指定個(gè)數(shù)字符,返回一個(gè)新的字符串
# 字符串:下標(biāo):1 -- 獲取字符串中指定下標(biāo)對(duì)應(yīng)的字符
# 字符串:下標(biāo) -- 從指定下標(biāo)開(kāi)始獲取到字符串最后
string='hello world'
echo ${string:1:4} # ello
4.shell數(shù)組
在 Shell 中,用括號(hào)來(lái)表示數(shù)組,數(shù)組元素用"空格"符號(hào)分割開(kāi)。定義數(shù)組的一般形式為:
# 數(shù)組名=(元素1 元素2 元素3 ...)
names=(小明 小紅 大黃 Tom)
names2=(
'小明'
'小紅'
'大黃'
'Tom'
)
names3[0]=小明
names3[1]=小紅
names3[2]=大黃
names3[3]=Tom
1)獲取數(shù)組元素:${數(shù)組[下標(biāo)]}
echo ${names[1]} # 小紅
2)獲取數(shù)組的長(zhǎng)度
nums=(100 200 300 400)
# 獲取數(shù)組長(zhǎng)度
length=${#nums[@]}
length=${#nums[*]}
# 獲取數(shù)組指定下標(biāo)對(duì)應(yīng)的元素的長(zhǎng)度
length2=${#num[n]}
5.運(yùn)算符
shell中支持的運(yùn)算符有: 算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、布爾運(yùn)算符、字符串運(yùn)算符
1)算術(shù)運(yùn)算符:+,-,*,/,%
# 如果想要在shell完成數(shù)值運(yùn)算,運(yùn)算的語(yǔ)法: `expr 運(yùn)算表達(dá)式`; 并且運(yùn)算符兩邊必須加空格
re1=10+20
echo ${re1} # 10+20
# 1.加法運(yùn)算
re2=`expr 10 + 20`
echo ${re2} # 30
# 2.減法運(yùn)算
re3=`expr 10 - 20`
echo ${re3} # -10
# 3.乘法運(yùn)算
re4=`expr 10 \* 20` # 注意:使用*作為乘法運(yùn)算符的時(shí)候需要前面加\
echo ${re4} # 200
# 4.除法運(yùn)算
# 小數(shù)除法運(yùn)算: `echo "scale=小數(shù)點(diǎn)位數(shù);數(shù)值1 / 數(shù)值2"|bc`
# 整數(shù)除法運(yùn)算: `expr 數(shù)值1 / 數(shù)值2`
re5=`echo "scale=2;7 / 3"|bc`
echo $re5
re6=`expr 5 / 2`
echo $re6
# 5.求余數(shù)
re7=`expr 10 % 3`
re8=`echo "10.2 + 5.1"|bc`
echo $re8
2) 關(guān)系運(yùn)算符(比較運(yùn)算符),比較的是數(shù)字大小
# -eq --- 等于,相當(dāng)于 ==
# -ne --- 不等于,相當(dāng)于!=
# -gt --- 大于
# -lt --- 小于
# -ge --- 大于等于
# -le --- 小于等于
# 使用語(yǔ)法: [ 值1 關(guān)系運(yùn)算符 值2 ]
a=100
b=10
# 關(guān)系運(yùn)算符要配合if語(yǔ)句或者循環(huán)語(yǔ)句使用
if [ $a -gt $b ]
then
echo a大于b
else
echo a不大于b
fi
3)布爾運(yùn)算符(邏輯運(yùn)算符)
# ! -- 邏輯非運(yùn)算
# -o -- 邏輯或運(yùn)算
# -a -- 邏輯與運(yùn)算
age=18
score=95
# 參加比賽的條件:分?jǐn)?shù)大于90分并且年齡大于等于18歲
if [ $age -ge 18 -a $score -gt 90 ]
then
echo 可以參見(jiàn)比賽
else
echo 不能參加比賽
fi
4)字符串運(yùn)算符
# [ 字符串1 = 字符串2 ] -- 判斷兩個(gè)字符串是否相等
# [ 字符串1 != 字符串2 ] -- 不相等
# [ -z 字符串] -- 判斷字符串長(zhǎng)度是否為0
# [ -n "字符串" ] -- 判斷字符串長(zhǎng)度是否不為0
# [ $ 字符串 ] -- 判斷字符串是否是空串
a="abc"
b="123"
if [ $a = $b ]
then
echo a和b相等
else
echo a和b不相等
fi
a=""
if [ -n "${a}" ]
then
echo a的長(zhǎng)度不為0
else
echo a的長(zhǎng)度為0
fi
6. if語(yǔ)句
語(yǔ)法1:
if 條件語(yǔ)句
then
滿足條件執(zhí)行的代碼
fi
語(yǔ)法2:
if 條件語(yǔ)句
then
滿足條件執(zhí)行的代碼
else
不滿足條件執(zhí)行的代碼
fi
語(yǔ)法3:
if 條件語(yǔ)句1
then
代碼塊1
elif 條件語(yǔ)句2
then
代碼塊2
elif 條件語(yǔ)句3
then
代碼塊3
else
代碼塊N
fi
7. for循環(huán)
語(yǔ)法:
for 變量 in 序列
do
循環(huán)體
done
# 遍歷字符串
for char in "hello word"
do
echo 循環(huán)體char: ${char}
done
# 遍歷數(shù)組
arr1=(10 20 "abc")
for x in ${arr1[@]}
do
echo 循環(huán)體2x: ${x}
done
# 遍歷多個(gè)值
for x in 10 20 "你好" 123
do
echo 循環(huán)體3:${x}
done
8. while循環(huán)
語(yǔ)法:
while 條件語(yǔ)句
do
循環(huán)體
done
# 遍歷字符串
str1="helloWorld!"
index=0
len=${#str1}
while [ $index -lt $len ]
do
echo ${str1:${index}:1}
index=`expr ${index} + 1`
done
# 計(jì)算1+2+3+...+100
num=1
sum=0
while [ ${num} -le 100 ]
do
sum=`expr ${sum} + ${num}`
num=`expr ${num} + 1`
done
echo 1+2+3+...+100 = ${sum}
# 死循環(huán)
while true
do
read -p "請(qǐng)輸入一個(gè)數(shù)字:" num
if [ ${num} == 100 ]
then
break
fi
done
9.函數(shù)
1)函數(shù)的聲明和調(diào)用
# 1.函數(shù)的聲明
聲明的語(yǔ)法:
函數(shù)名(){
函數(shù)體
}
調(diào)用函數(shù)語(yǔ)法: 函數(shù)名
#聲明函數(shù)
func1(){
echo 你好函數(shù)1
}
#調(diào)用函數(shù)
func1
# 2.有參數(shù)的函數(shù)
# 聲明的時(shí)候不需要形參, 直接在函數(shù)體中通過(guò)'${N}'來(lái)獲取第N個(gè)實(shí)參
# 調(diào)用的時(shí)候: 函數(shù)名 實(shí)參1 實(shí)參2 實(shí)參3 ...
func2(){
echo 函數(shù)2被調(diào)用
echo 第一個(gè)參數(shù): ${1}
echo 第二個(gè)參數(shù): ${2}
echo 第三個(gè)參數(shù): ${3}
}
func2 10 20 "abc"
# 3.函數(shù)的返回值
# return 數(shù)字 - 數(shù)字的范圍是0~255
func3(){
echo 函數(shù)3被調(diào)用
return 256
#a=`expr 100 + 200`
}
func3
echo ${?}