3.3 Shell腳本編程基礎(chǔ)

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 ${?}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,711評(píng)論 0 5
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 6,328評(píng)論 0 10
  • 特別說(shuō)明:以下內(nèi)容來(lái)自簡(jiǎn)書(shū),鏈接為原文出處,一切權(quán)益歸原作者所有,在此感謝原作者的分享,大家可以點(diǎn)擊以下鏈接查看原...
    沈祥佑閱讀 621評(píng)論 0 4
  • 用了caffe有一段時(shí)間了,感覺(jué)自己寫shell腳本的能力有待提高,特地從菜鳥(niǎo)筆記處系統(tǒng)的看了一遍,其實(shí)學(xué)習(xí)基礎(chǔ)就...
    yichen_china閱讀 1,879評(píng)論 2 30
  • 概念和原理 Shell是什么? Shell 是一個(gè)用 C 語(yǔ)言編寫的程序,它是用戶使用 Linux 的橋梁。 Sh...
    陵無(wú)山閱讀 3,682評(píng)論 0 27

友情鏈接更多精彩內(nèi)容