零基礎學習linux 第十五章 shell 編程(選學內容)

一、入門

什麼是 shell?
首先打開一個終端,在終端裏能做的操作, 如 cd ,cp 等
以及在終端裏執行的命令,如 date,echo 等, 都能同樣的寫進.sh 腳本里面去,

此時,你可以把腳本文件理解成一個”命令包”, 運行一個文件相當於運行了裏面的多個操作和命令. (參照 windows 下的.bat 文件來理解)

那麼讓我們來做一個最簡單的.sh 文件文件名: simple.sh
代碼示例

#!/bin/bash 
cd /var/tmp/ 
pwd

第 2 步,加上執行權限, chmod u+x simple.sh
(腳本編輯完成後,需要加”可執行權限”這一步,在下面的腳本示例中,就不再重複寫了,請大家自己加)

第 3 步 執行,
./simple.sh

看看打印什麼?(和在終端直接執行 cd /var/tmp , pwd 兩個命令的效果是一樣的)

二、進階

既然是 shell 編程,那麼必然少不了變量,表達式,及控制結構這些.
分別講解如下:
變量有三種:
1:自定義變量
2:系統變量
3:命令返回值變量
我們先來試一下自定義變量代碼示例

#!/bin/bash
 var1=hello
  var2=bash
#注意,=號兩邊都不要有空格
echo $var1 $var2

此時,我們就聲明瞭一個簡單的變量.
注意:聲明變量時,不要加,=,,,且'='號前後不要加空格, 而在引用變量時,則要加上,如 echo $var1
再來試一下系統變量文件名: sys.sh
代碼示例

#!/bin/bash 
echo $HOME 
echo $USER

運行 sys.sh 查看結果?
對於HOME,HOME,USER,我們並沒有定義這兩個變量,但爲什麼可以打印出結果呢? 這是因爲HOME,HOME,USER 是系統變量,系統已經定義好了,不用我們再定義.

最後來試一下命令返回值變量腳本: com.sh
代碼示例

#!/bin/bash
var1=`date +%y%m%d` echo $var1
date +%y%m%d

運行 ./com.sh, 看看打印結果? 分析一下兩行的結果各是怎麼樣打印出來的?

思考:命令的輸出內容如何賦到變量裏?
答:有時候,我們需要把命令的運行結果捕捉,並賦給某變量,則可以用反引號 命令 來實現. 如 pos=pwd,則 pwd 命令的結果將賦給 pos 變量.

三、提高

會定義變量,會使用系統變量,會捕捉命令的返回值,還不夠, 有了變量,還要有表達式和控制結構,才能叫”程序”

表達式有”命令表達式”,”數學表達式”,”字符串表達式”,”文件判斷表達式”
控制結構有 if/ case/for/while
先來看一下命令表達式和 if/else 控制結構
命令表達式 是指 如果一個命令執行成功,則返回 true,如果執行失敗,則執行 false if/else 的語法格式如下:

if 表達式
then
語句 1
語句 2
....
else
語句 one
語句 two
.....
fi

結合命令表達式,和 if 控制結構,我們創建一個腳本:com_exp.sh
作用:幫我們創建一個目錄 dir1, 如果創建成功,則顯示 ok;如果失敗,則顯示 fail.
代碼示例:

#!/bin/bash 
if mkdir dir1 
then
echo ok 
else 
echo fail
fi

先保證當前目錄下沒有 dir1 目錄,然後運行 2 次此腳本,看看分別打印什麼結果,並思考爲什麼?

數學比較表達式
數學比較表達式的作用: 比較兩數的大小關係
數學表達式是這樣的結構[ $var1 -gt/-lt/-eq/-ge/-le/-ne $var2 ]
注意:中括號兩端各有 1 空格比較運算符的含義見下:
-gt >
-lt <
-ge >=
-le <=
-eq =
-ne !=

創建腳本 math.sh
作用:判斷兩個變量的大小,並打印結果. 代碼示例:

#!/bin/bash 
var1=8
var2=12
if [ $var1 -gt $var2 ] 
then
echo $var1 more than $var2 
elif [ $var1 -eq $var2 ]
then
echo $var1 equal $var2 
else
echo $var1 less than $var2 
fi

字符串判斷表達式
字符串表達式的作用: 用於判斷兩字符串是否相同格式:

[ $str1 =/!= str2 ]

注意:中括號兩端各有 1 空格代碼示例

#!/bin/bash 
var1=hello 
var2=world
if [ $var1 = $var2 ] 
then
echo $var1 is $var2 
else
echo $var1 is not $var2

文件判斷表達式
文件表達式作用:判斷文件是否存在,是否可讀/可寫/可執行,是否是目錄或普通文件等, 以及用來比較兩個文件的新舊順序.
格式 1: [ -d/-f/-e/-r/-w/-x filename ]
分別判斷
-d 文件是否存在且是目錄
-f 文件是否存在且是文件
-e 是否存在
-r 是否可讀
-w 是否可寫
-x 是否可執行
格式 2: [ file1 -nt/-ot file2 ]
分別判斷
-nt 檢查 file1 是否爲 file2 新
-ot 檢查 file1 是否爲 file2 舊
創建腳本: file.sh
作用:判斷當前目錄下有沒有 dir2 目錄代碼示例

#!/bin/bash
 if [ -d ./dir2 ] 
 then
ls dir2 
else
echo dir2 is not exists 
fi

控制結構:
if/else 結構(上面有很多例子,跳過)

for 結構 (for 循環有兩種)
1: bash 風格的 for 循環格式如下:
for 變量名 in 值 1 值 2 值 3 值 n
do
語句 1
語句 2

done

創建腳本 bash_for.sh 作用: 打印 A B C D E 代碼示例:

#!/bin/bash
for i in A B C D E 
do
echo $i 
done

2:C 風格的 for 循環格式如下:
for((變量=初始值;變量<=n;變量++)) do
語句 1
語句 2

done
創建腳本:c_bash.sh 作用:計算 1-100 的和代碼示例:

#!/bin/bash 
for((i=1;i<=100;i++))
sum=0 
do
sum=$[ $sum + $i ] 
done
echo $sum

case 結構介紹
格式如下:
case 變量 in
可能性 1)
語句 1
語句 2
;;
可能性 2)
語句 1
語句 2
;;
*)
語句 1
語句 2
;;

創建腳本: case.sh
作用:判斷當前登陸者是誰,並根據情況打印不同內容代碼示例

#!/bin/bash 
case $USER in shiba)
echo -n “you “ 
echo -n “are “ 
echo “shiba”;; 
shijiu)
echo you are shijiu
*)
echo sorry! 

幾行語句後面,放兩個;;就可以了, 而不是每行後面都放兩個;;
*代表以上情況都不是時,類似於 java 中的 default

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章