3.3 Shell腳本編程基礎

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 ${?}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市花枫,隨后出現(xiàn)的幾起案子刻盐,更是在濱河造成了極大的恐慌,老刑警劉巖劳翰,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敦锌,死亡現(xiàn)場離奇詭異,居然都是意外死亡佳簸,警方通過查閱死者的電腦和手機乙墙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來生均,“玉大人听想,你說我怎么就攤上這事÷黼剩” “怎么了汉买?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長佩脊。 經(jīng)常有香客問我蛙粘,道長,這世上最難降的妖魔是什么威彰? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任出牧,我火速辦了婚禮,結(jié)果婚禮上歇盼,老公的妹妹穿的比我還像新娘舔痕。我一直安慰自己,他們只是感情好旺遮,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布赵讯。 她就那樣靜靜地躺著,像睡著了一般耿眉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鱼响,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天鸣剪,我揣著相機與錄音,去河邊找鬼。 笑死筐骇,一個胖子當著我的面吹牛债鸡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铛纬,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼厌均,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了告唆?” 一聲冷哼從身側(cè)響起棺弊,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎擒悬,沒想到半個月后模她,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡懂牧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年侈净,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片僧凤。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡畜侦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躯保,到底是詐尸還是另有隱情夏伊,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布吻氧,位于F島的核電站溺忧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盯孙。R本人自食惡果不足惜鲁森,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望振惰。 院中可真熱鬧歌溉,春花似錦、人聲如沸骑晶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桶蛔。三九已至匙头,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仔雷,已是汗流浹背蹂析。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工舔示, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人电抚。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓惕稻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蝙叛。 傳聞我的和親對象是個殘疾皇子俺祠,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,370評論 0 5
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,723評論 0 10
  • 特別說明:以下內(nèi)容來自簡書借帘,鏈接為原文出處蜘渣,一切權益歸原作者所有,在此感謝原作者的分享姻蚓,大家可以點擊以下鏈接查看原...
    沈祥佑閱讀 551評論 0 4
  • 用了caffe有一段時間了宋梧,感覺自己寫shell腳本的能力有待提高狰挡,特地從菜鳥筆記處系統(tǒng)的看了一遍,其實學習基礎就...
    yichen_china閱讀 1,821評論 2 30
  • 概念和原理 Shell是什么加叁? Shell 是一個用 C 語言編寫的程序倦沧,它是用戶使用 Linux 的橋梁它匕。 Sh...
    陵無山閱讀 3,538評論 0 27