shell腳本編程簡介

 

1.什麼是shell

2. 還是hello world程序

3. shell中的變量

3.1 系統變量

3.2 用戶定義變量

3.2.1 用戶定義變量規則

3.2.3 shell如何使用變量

3.2.3 全局變量 vs 局部變量 

4. shell編程中的控制結構

4.1 條件判定

4.1.1 簡單條件判定

4.1.2 組合判定 

4.2  if - else

4.3 for

4.4 while

4.5 case

5. shell中的函數

5.1 函數聲明和定義

5.2 函數調用

6. shell腳本調試

6.1 萬能的echo

6.2  兩個命令

7. 參考資料及shell腳本下載 

<1>. 什麼是shell 

shell扮演者操作系統內核和用戶的中間人的角色,用戶通過鍵入shell command,然後shell通過解析用戶輸入,然後將請求轉發給操作系統的內核進行處理。


 1. 一個系統可以存在多個shell,可以通過cat /etc/shells命令查看系統中安裝的shell,不同的shell可能支持的命令語法是不相同的。

 2. 可以通過echo $SHELL查看當前使用的shell 

<2>. 還是hello world程序 

首先使用vim編輯器(或者是linux下任意的文本編輯器)編寫文件helloshell.sh(沒有必要使用.sh後綴名):

 #!/bin/bash

echo "hello shell";

保存上面的文件,增加該文件的執行權限:

 xuqiang@ubuntu:~/shell$ sudo chmod +x ./helloshell.sh

運行該shell程序:

 xuqiang@ubuntu:~/shell$ ./helloshell.sh

hello shell

通過上面的程序沒有什麼實際的含義,但是通過第一個shell程序瞭解shell程序的執行過程。 

<3>. shell中的變量 

3.1 系統變量

linnux下的shell腳本中的變量分爲“系統變量”和“用戶自定義變量”,可以通過set命令查看那系統變量。

xuqiang@ubuntu:~/shell$ set

... 略去內容

xuqiang@ubuntu:~/shell$ echo $HOME

/home/xuqiang

3.2 用戶定義變量

shell中用戶可以自定義變量,shell中的變量是沒有數據類型的,shell將根據當前的環境自動進行轉化,例如:

msg="hello world" 

上面的語句定義變量msg,並設置初始值是爲hello world。

  Tip 1. 需要注意的是定義變量時,=兩邊是沒有空格的 

3.2.1  用戶定義變量規則

變量必須是以字母開頭,後跟字母或者是下劃線,變量的命名是大小寫敏感的,並且可以定義一個變量的值爲NULL。

xuqiang@ubuntu:~/shell$ vech=

xuqiang@ubuntu:~/shell$ echo $vec

3.2.2  shell中如何使用變量

如果想要得到shell變量中存儲的值的話,需要在變量名前增加$符號,例如:

xuqiang@ubuntu:~/shell$ vech="value"

xuqiang@ubuntu:~/shell$ echo $vech # this will print the value of vech

value

xuqiang@ubuntu:~/shell$ echo vech # this will print the string "vech"

vech

3.2.3 全局變量 vs 局部變量 

默認在shell中編寫的變量全部是局部變量,如果重新打開console的話,那麼這些變量將全部丟失,全局的變量可以寫在文件~/.bashrc文件。

<4>. 控制結構 

4.1 條件判定

在shell中條件判斷是通過test命令或者是[ ]實現, 判斷條件如下:

數學運算: 

a -eq b :a == b
a -ne b : a != b
a -lt b : a < b
a -le b : a <= b
a -gt b : a > b
a -ge b : a >= b

string比較:
string1 = string2
string1 != string2
string1 : string1 不是NULL,或者是沒有定義

4.2 組合判定 

邏輯運算符:

! : not

exp1 -a exp2 : a && b

exp1 -o exp2 : exp1 || exp2 

4.3 if-else結構:

複製代碼

!/bin/sh#
# see whether arguments is positive
#
if [ $# -ne 1 ]
then
        
echo "$0 : you must give/supply one integers"
        
exit 1
fi

if test $1 -gt 0
then
        
echo "$1 number is postivie"
else
        
echo "$1 number is negative"
fi

複製代碼


複製代碼

#!/bin/sh                               

osch
=0

echo "1. unix(sun os)"
echo "2. linux(red hat)"
echo -n "select your os choice [1 or 2] ?"
read osch

if [ $osch -eq 1  ]
then
        
echo "you pick up unix"
else
        
#
        
# nested if
        
if [ $osch -eq 2 ]
        
then
                
echo "you pick up linux"
        
else
                
echo "what you donot like unix/linux"
        fi
fi

複製代碼

 


複製代碼

#!/bin/sh
#
# test the if .. elif .. else
#
if [ $1 -gt 0 ] ; then
        
echo "$1 is positive"
elif [ 
$1 -lt 0 ] ; then
        
echo "$1 is negative"
elif [ 
$1 -eq 0 ] ; then
        
echo "$1 is zero"
else
        
echo "$1 is not a number"
fi

複製代碼

 4.4 for

複製代碼

!/bin/sh

#
# test for
#

for i in 1 2 3 4 5
do
        
echo "welcome $i times"
done

複製代碼

複製代碼

#!/bin/bash

for (( i = 0; i <= 5; i++ ))
do
        
echo "welcome $i times"

done  

複製代碼

 Tip 1. 注意程序中使用的shell腳本的類型


複製代碼

#!/bin/bash

for(( i = 1; i <= 5; i++  ))
do
        
for(( j = 1; j <= 5; ++))
        
do
                
echo -n "$i"
        done

# print a new line
        
echo ""
done

複製代碼

4.5 while

複製代碼

#!/bin/bash

#
# test while loop
#

n
=$1
i
=0
while [ 
$i -le 10 ]
do
        
echo "$n * $i = `expr $i \* $n`"
        i
=`expr $+ 1`

done   

複製代碼

4.6 case 

複製代碼

#!/bin/bash

#
# script to test case statement
#
action
="update"
case 
$action in
        
"update")
                
echo "update the db"
                
;;
        
"select")
                
echo "select from db"
                
;;
        
"delete")
                
echo "delete from db"
                
;;
        *
)
                
echo "no action"
                
;;

esac  

複製代碼

<5>. 函數 

5.1 函數聲明和定義

下面的程序中定義函數demo,向函數傳遞的所有參數表示爲$*,第一個參數$1,第二個參數$2, 依次類推。

複製代碼

#!/bin/bash

function demo
()
{
        
echo "all function args : $*"
        
echo "the first arg : $1"
        
echo "the second arg : $2"
        
echo "the third arg : $3"
}

# call the function

demo -f foo bar  

複製代碼

5.2 函數調用(函數參數)

shell中向函數傳遞參數是通過直接在函數調用後面添加參數完成,在函數中,傳遞的參數通過$1得到。

<6>. 腳本調試 

6.1 萬能的echo

shell的腳本調試是比價噁心的,這裏僅僅是提供一些常規性的調試方法,最簡單的就是使用echo函數打印出變量的值從而達到調試目的。

6.2 兩個命令

shell腳本執行可以通過./shell-filename.sh的形式執行,另外的一種形式是通過bash ./shell-filename.sh的形式執行,同時在執行腳本時,可以使用-v或者是-x參數打印程序執行信息。

-v:默認打印shell讀取的內容

-x:將命令“展開” 之後打印

例如對於下面的程序:

!/bin/sh

# for debug shell script
#
tot
=`expr $1 + $2`
echo $tot

如果使用-v選項,結果如下:

 xuqiang@ubuntu:~/shell$ sh -v ./debug.sh 2 5

#!/bin/sh

#

# for debug shell script

#

tot=`expr $1 + $2`

echo $tot

7

如果是使用-x選項的話,結果:

 xuqiang@ubuntu:~/shell$ sh -x ./debug.sh 2 5

+ expr 2 + 5

+ tot=7

+ echo 7

7

轉載地址:http://www.cnblogs.com/xuqiang/archive/2011/04/27/2031034.html

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