linux快速掌握第十六章 shell 編程(選學內容)

入門

什麼是 shell?

首先打開一個終端,在終端裡能做的操作, 如 cd ,cp 等

以及在終端裡執行的命令,如 date,echo 等, 都能同樣的寫進.sh 腳本里面去,

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

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

代碼示例

<code>#!/bin/bash 
cd /var/tmp/
pwd/<code>

第 2 步,

加上執行權限, chmod u+x simple.sh

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

第 3 步

執行, ./simple.sh

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

進階

既然是 shell 編程,那麼必然少不了變量,表達式,及控制結構這些.

分別講解如下:

變量有三種:

1:自定義變量

2:系統變量

3:命令返回值變量

我們先來試一下自定義變量代碼示例

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

注意:聲明變量時,不要加$,且'='號前後不要加空格, 而在引用變量時,則要加上$,如 echo $var1

再來試一下系統變量文件名: sys.sh

代碼示例

<code>#!/bin/bash 
echo $HOME
echo $USER/<code>

運行 sys.sh 查看結果?

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

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

代碼示例

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

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

思考:命令的輸出內容如何賦到變量裡?

答:有時候,我們需要把命令的運行結果捕捉,並賦給某變量,則可以用反引號 `命令` 來實現. 如 pos=`pwd`,則 pwd 命令的結果將賦給 pos 變量.

提高

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

表達式有”命令表達式”,”數學表達式”,”字符串表達式”,”文件判斷表達式”

控制結構有 if/ case/for/while

先來看一下命令表達式和 if/else 控制結構

命令表達式 是指 如果一個命令執行成功,則返回 true,如果執行失敗,則執行 false if/else 的語法格式如下:

<code>f 表達式
then
語句 1
語句 2
....
else
語句 one
語句 two
.....
fi/<code>

結合命令表達式,和 if 控制結構,我們創建一個腳本:com_exp.sh

作用:幫我們創建一個目錄 dir1, 如果創建成功,則顯示 ok;如果失敗,則顯示 fail.

代碼示例:

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

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

數學比較表達式

數學比較表達式的作用: 比較兩數的大小關係

數學表達式是這樣的結構[ $var1 -gt/-lt/-eq/-ge/-le/-ne $var2 ]

注意:中括號兩端各有 1 空格比較運算符的含義見下:

-gt >

-lt <

-ge >=

-le <=

-eq =

-ne !=

創建腳本 math.sh

作用:判斷兩個變量的大小,並打印結果. 代碼示例:

<code>#!/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/<code>

字符串判斷表達式

字符串表達式的作用: 用於判斷兩字符串是否相同格式:[ $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

目錄代碼示例:

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

控制結構:

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 代碼示例:

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

done/<code>

2:C 風格的 for 循環格式如下:

for((變量=初始值;變量<=n;變量++)) do

語句 1

語句 2

...

done

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

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

case 結構介紹

格式如下:

case 變量 in

可能性 1)

語句 1

語句 2

;;

可能性 2)

語句 1

語句 2

;;

*)

語句 1

語句 2

;;

創建腳本: case.sh

作用:判斷當前登陸者是誰,並根據情況打印不同內容

代碼示例

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

幾行語句後面,放兩個;;就可以了, 而不是每行後面都放兩個;;

*代表以上情況都不是時,類似於 java 中的 default


分享到:


相關文章: