shell編程
Shell腳本畔濒,是一種為shell編寫的腳本程序难述。
Shell編程跟JavaScript妻往、Python編程一樣稍浆,只要有一個能編寫代碼的文本編輯器和一個能解釋執(zhí)行的腳本解釋器就可以了载碌。
Linux的Shell種類有很多,我們主要用的是Bourne Shell(/usr.bin/sh或/bin/sh)
1.創(chuàng)建shell文件
原則上shell程序可以寫在任何文件中衅枫,但是一般會在shell文件后加后綴.sh表示當前文件是一個shell文件
shell需要可執(zhí)行權限嫁艇,所以創(chuàng)建好的shell文件需要添加x權限
2.基礎語法
1)注釋
# 單行注釋
:<<EOF
多行注釋1
多行注釋2
多行注釋3
EOF
2)輸出和輸入
echo指令就相當于python中的print函數(shù)(默認會換行)
echo 輸出內(nèi)容
echo -n 輸出內(nèi)容 # 輸出的時候不換行
printf指令(輸出不能換行)
printf 輸出內(nèi)容
輸入指令:
read 變量名 -- 輸入內(nèi)容,并且將輸入的結(jié)果保存在變量中
3)變量
a. 聲明變量的語法: 變量名=值
說明: 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腳本的時候這些指令可以直接獲取
ls # ls指令
ls -lh # ls指令益楼,并且設置參數(shù)
touch a.txt # 創(chuàng)建a.txt文件
# 獲取指令結(jié)果: 變量=$(指令) / 變量=`指令`
lsresult=$(ls) #將ls指令的結(jié)果保存到變量lsresult中
currnet_path=`pwd`
3.shell字符串
shell中的字符串可以用單引號也可以使用雙引號甚至可以不用引號猾漫。但是單引號中不能出現(xiàn)單引號字符,加\也不行
str1='abc'
str2="abc"
str3=abc
str4='abc\n123' #支持轉(zhuǎn)義字符,但是不支持編碼字符
str5="abc\n123"
age=18
str6="年齡是$age" #雙引號里面可以出現(xiàn)變量,單引號不行
1)字符串拼接
str1="hello"
#單引號拼接
str2=''${str1}',world!'
str3=''$str1',world!'
#雙引號拼接
str4="${str1},world!"
str5=""$str1",world!"
2)獲取字符串長度
str1="abcd"
echo ${#str1} # 輸出4
3)字符串提取
# 字符串:下標:個數(shù) --從字符串中指定下標開始獲取指定個數(shù)字符,返回一個新的字符串
# 字符串:下標:1 -- 獲取字符串中指定下標對應的字符
# 字符串:下標 -- 從指定下標開始獲取到字符串最后
string='hello world'
echo ${string:1:4} # ello
4.shell數(shù)組
在 Shell 中感凤,用括號來表示數(shù)組悯周,數(shù)組元素用"空格"符號分割開。定義數(shù)組的一般形式為:
# 數(shù)組名=(元素1 元素2 元素3 ...)
names=(小明 小紅 大黃 Tom)
names2=(
'小明'
'小紅'
'大黃'
'Tom'
)
names3[0]=小明
names3[1]=小紅
names3[2]=大黃
names3[3]=Tom
1)獲取數(shù)組元素:${數(shù)組[下標]}
echo ${names[1]} # 小紅
2)獲取數(shù)組的長度
nums=(100 200 300 400)
# 獲取數(shù)組長度
length=${#nums[@]}
length=${#nums[*]}
# 獲取數(shù)組指定下標對應的元素的長度
length2=${#num[n]}
5.運算符
shell中支持的運算符有: 算術運算符陪竿、關系運算符禽翼、布爾運算符、字符串運算符
1)算術運算符:+,-闰挡,*仇矾,/,%
# 如果想要在shell完成數(shù)值運算解总,運算的語法: `expr 運算表達式`; 并且運算符兩邊必須加空格
re1=10+20
echo ${re1} # 10+20
# 1.加法運算
re2=`expr 10 + 20`
echo ${re2} # 30
# 2.減法運算
re3=`expr 10 - 20`
echo ${re3} # -10
# 3.乘法運算
re4=`expr 10 \* 20` # 注意:使用*作為乘法運算符的時候需要前面加\
echo ${re4} # 200
# 4.除法運算
# 小數(shù)除法運算: `echo "scale=小數(shù)點位數(shù);數(shù)值1 / 數(shù)值2"|bc`
# 整數(shù)除法運算: `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) 關系運算符(比較運算符)贮匕,比較的是數(shù)字大小
# -eq --- 等于,相當于 ==
# -ne --- 不等于,相當于!=
# -gt --- 大于
# -lt --- 小于
# -ge --- 大于等于
# -le --- 小于等于
# 使用語法: [ 值1 關系運算符 值2 ]
a=100
b=10
# 關系運算符要配合if語句或者循環(huán)語句使用
if [ $a -gt $b ]
then
echo a大于b
else
echo a不大于b
fi
3)布爾運算符(邏輯運算符)
# ! -- 邏輯非運算
# -o -- 邏輯或運算
# -a -- 邏輯與運算
age=18
score=95
# 參加比賽的條件:分數(shù)大于90分并且年齡大于等于18歲
if [ $age -ge 18 -a $score -gt 90 ]
then
echo 可以參見比賽
else
echo 不能參加比賽
fi
4)字符串運算符
# [ 字符串1 = 字符串2 ] -- 判斷兩個字符串是否相等
# [ 字符串1 != 字符串2 ] -- 不相等
# [ -z 字符串] -- 判斷字符串長度是否為0
# [ -n "字符串" ] -- 判斷字符串長度是否不為0
# [ $ 字符串 ] -- 判斷字符串是否是空串
a="abc"
b="123"
if [ $a = $b ]
then
echo a和b相等
else
echo a和b不相等
fi
a=""
if [ -n "${a}" ]
then
echo a的長度不為0
else
echo a的長度為0
fi
6. if語句
語法1:
if 條件語句
then
滿足條件執(zhí)行的代碼
fi
語法2:
if 條件語句
then
滿足條件執(zhí)行的代碼
else
不滿足條件執(zhí)行的代碼
fi
語法3:
if 條件語句1
then
代碼塊1
elif 條件語句2
then
代碼塊2
elif 條件語句3
then
代碼塊3
else
代碼塊N
fi
7. for循環(huán)
語法:
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
# 遍歷多個值
for x in 10 20 "你好" 123
do
echo 循環(huán)體3:${x}
done
8. while循環(huán)
語法:
while 條件語句
do
循環(huán)體
done
# 遍歷字符串
str1="helloWorld!"
index=0
len=${#str1}
while [ $index -lt $len ]
do
echo ${str1:${index}:1}
index=`expr ${index} + 1`
done
# 計算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 "請輸入一個數(shù)字:" num
if [ ${num} == 100 ]
then
break
fi
done
9.函數(shù)
1)函數(shù)的聲明和調(diào)用
# 1.函數(shù)的聲明
聲明的語法:
函數(shù)名(){
函數(shù)體
}
調(diào)用函數(shù)語法: 函數(shù)名
#聲明函數(shù)
func1(){
echo 你好函數(shù)1
}
#調(diào)用函數(shù)
func1
# 2.有參數(shù)的函數(shù)
# 聲明的時候不需要形參, 直接在函數(shù)體中通過'${N}'來獲取第N個實參
# 調(diào)用的時候: 函數(shù)名 實參1 實參2 實參3 ...
func2(){
echo 函數(shù)2被調(diào)用
echo 第一個參數(shù): ${1}
echo 第二個參數(shù): ${2}
echo 第三個參數(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 ${?}