shell 編程基礎

(一)shelll 腳本

什麼是shell腳本?

簡單的說,只要將平時使用的各種linux命令,按順序保存到一個文本文件中,然後添加可執行權限,這個文件就成爲一個shell腳本。

shell腳本格式:

#!/bin/bash      //特殊腳本聲明,表示此行以後的語句通過/bin/bash程序來解釋執行

#這是一個簡單的shell腳本    //#開頭表示註釋信息

cd ~root

touch shell

mv shell shelll

echo 這就是shell腳本的基本格式    //echo用於輸出字符串,以使腳本輸出信息更容易讀懂

shell腳本運行方式

1.給腳本添加可執行權限(x

:chmod +x shell

./shell

2.通過內部命令shsource.

sh -x shell(-x參數,可以查看腳本運行過程)

   source shell

. shell

(二)shell 變量

什麼是shell變量

shell變量用來存放系統和用戶需要使用的特定參數(值),而且這些參數可以根據用戶的設定或系統環境的變化而相應變化,通過使用變量,shell程序能夠提供更加靈活的功能,適應性更強。

set 查看所有shell變量

unset 刪除變量(後跟變量名即可)

1.自定義變量(本地變量)

_XIAO=this     //設置自定義變量

  echo _XIAO      //查看自定義變量

注:變量名建議用大寫,只能用字母、數字,下劃線,而且不能以數字開頭

雙引號 ""

_XIAO1="$XIAO is cat"     //要包括別的變量,或跟多個單詞,必須用""括起來

echo $_XIAO1

this is cat

單引號 ''

   _XIAO2='$XIAO is cat !'    //不能包含變量,裏面寫什麼就是什麼

   echo $_XIAO2    

   $XIAO is cat !

反撇號 ``                  

  _XIAO3=`which man`                 //將可執行的命令行的結果,賦值給自定義變量

  echo $_XIAO3

  /usr/bin/man

$()

 _XIAO3=$(rpm -qf $(which man))    //如果要使用多重反撇號,只能用$()表示

 echo $_XIAO3

 man-1.6f-32.el6.x86_64

expr數值變量的運算

注:expr命令對整數型變量進行算術變量

#!/bin/bash

#這是個數值變量運算

VALUE1=10

VALUE2=20

VALUE3=30

A=`expr $VALUE1 + $VALUE2 + $VALUE3`

echo + $A            +

B=`expr $VALUE1 - $VALUE2 - $VALUE3`

echo - $B            -

C=`expr $VALUE1 \* $VALUE2 \* $VALUE3`

echo "\* $C"         \*乘(因爲*是通配符,不能當乘法運算符,所以要加轉譯符\

D=`expr $VALUE1 / $VALUE2 / $VALUE3`

echo / $D            /

read命令:從鍵盤讀入數據,賦給變量

例:

#!/bin/bash

read A B C

echo one is $A

echo two is $B

echo three is $C

sh read.sh         //執行shell腳本

10 20 30          //輸入102030

one is 10

two is 20

three is 30

2.環境變量

set 查看當前工作下的環境變量

3.位置變量

將命令行的第一個部分作爲命令名,其它部分作爲參數。

例:

#!bin/bash

#這是一個位置變量

ls -l $1 $2 $3     //$0爲這個程序的命令名即ls -l,$n爲這個程序的第n個參數吧,n=1-9

sh wzbl.sh file1 fil2 fil3    //file1file2file3 分別對應$1 $2 $3

4.預定義變量

$* 這個程序的所有參數

$# 這個程序的參數個數

$$ 這個程序的PID

$! 執行上一個命令的PID

$? 執行上一個命令行的返回值   0爲這個程序執行正確  非0爲不正確

$0 這個程序本身

例:

#!/bin/bash

#this is ydybl

echo '$* is' $*

echo '$# is' $#

echo '$$ is' $$

echo '$! is' $!

echo '$? is' $?

echo '$0 is' $0

echo '$1 is' $1

echo '$2 is' $2

echo '$3 is' $3

echo '$4 is' $4

sh ydybl.sh file1 file2 file3 file4       //執行預定義變量腳本

$* is file1 file2 file3 file4

$# is 4          

$$ is 21155

$? is 0

$0 is tsbl.sh

$1 is file1        //位置變量1file1

$2 is file2        //位置變量2file2

$3 is file3        //位置變量3file3

$4 is file4        //位置變量4file4

(三)條件測試操作

1.test條件表達式

形式一:test 條件表達式

例:

test 5 -ne 6 && echo '5不等於6'

5不等於6

形式二:[條件表達式]

例:

[ 5 -ne 6 ] && echo "5不等於6"

5不等於6

字符串測試:

test xiao = hang 測試字符串是否相等

test xiao != hang 測試字符串是否不相等

test xiao  測試字符串是否不爲空

test -n xiao 測試字符串是否不爲空

test -z xiao 測試字符串是否爲空

整數測試:

test xiao -eq hang 測試整數是否相等

test xaio -ge hang 測試xiao是否>=hang

test xiao -gt hang 測試xiao是否>hang

test xiao -le hang 測試xaio是否<=hang

test xiao -lt hang 測試xiao是否<hang

test xiao -ne hang 測試整數是否不相等

文件測試:

test -d xiao 指定文件是否爲目錄

test -f xiao 指定文件是否爲文件

test -x xiao 指定文件是否是否可執行

test -r xiao 指定文件是否可讀

test -w xiao 指定文件是否可寫

test -a xiao 指定文件是否存在   或者用-e參數

test -s xiao 文件大小是否非0

邏輯測試:

! 邏輯否(不)

&& -a 邏輯與(而且),-a只能使用test命令測試時才能用

|| -o 邏輯與(或者),-o只能使用test命令測試時才能用(只寫一個test就可以)

例:

A=5

test $A -gt 10 || test 1 -lt $A  && echo "符合要求" test $A -gt 10 -o1 -lt $A  && echo "符合要求"

2.單分支if語句

如果結果爲“真”就執行一個操作,爲“假”什麼都不執行

if [條件測試操作]

 then

 命令序列

fi

3.雙分支if語句

如果結果爲“真”執行一個操作,爲“假”再執行一個操作

if [條件測試操作]

then

 命令序列1

else

 命令序列2

fi

4.多分支if語句

if [條件測試操作1]

then

 命令序列1

elif [條件測試2]

then

 命令序列2

else

 命令序列3

fi

例:

#!/bin/bash

#多分支if語句

echo 請輸入您的成績

read A read -p 請輸入您的成績 A

if [ $A -ge 85 ] && [ $A -le 100 ]

then

  echo 您的成績爲,優!

elif [ $A -ge 70 ] && [ $A -le 84 ]

then

  echo 您的成績爲合格!

else

  echo 您的成績不合格?

fi

() for循環語句

for循環語句語法結構:

for 變量名 in 取值列表

do

命令序列

done

例:

#!/bin/bash

#這是個批量添加用戶的腳本

USER=xiao

A=123

for NAME in {1..10}     //變量名爲NAME,取值範圍爲1~10

do

useradd ${USER}$NAME &> /dev/null    //批量添加用戶,並把消息給/dev/null

echo "${USER}${NAME}${A}" | passwd --stdin ${USER}$NAME &> /dev/null     //批量設置密碼

done

() while循環語句

特殊條件測試操作: while true() while false(假)    //while true 等同於 while :

let XIAO++  使變量XIAO的值增加1(等同於XIAO=`expr $XIAO + 1`

exit 0 退出

break 強制退出

while循環語句語法結構:

while 條件測試操作

do

命令序列

done

例:

ech#!/bin/bash

#猜我生日

D=0

echo "猜猜我生日吧,我是哪一年"

while true    

do

read A

let D++

if [ $A -lt 1993 ]

then

  echo "我有那麼老嗎?再猜猜看哦! "

elif [ $A -eq 1993 ]

then

  echo "你總共猜了${D}"

  echo "小子,眼力不錯嘛?"

  break

else

  echo "我有那麼小嗎?再猜猜看哦!"

fi

done

()  case分支語句

case 語句的結構:

case 變量值 in

模式1

  命令序列1

;;

模式2

 命令序列2

;;

......

* )        //若找不到任何匹配的值,則執行默認模式

默認命令序列

esac

例:

e#!/bin/bash

#整人的心理測試題

echo " ------------------------------------------------------------"

echo "|這是一道高智商的心裏測試題,作者xiaoxiao|"

echo " ------------------------------------------------------------"

echo

echo "做題前要有心理準備哦!"

echo "  你被困在一個孤島上,船隻能載一個人,你需要選擇"

echo "A 搶船走人"

echo "B 殺死美女搶船走人"

echo "C 留下美女天天雲雨"

echo "D 放走美女自己等死"

echo "請您做出選擇,並按Enter鍵確認"

F=0

G="您可嘗試做出別的選擇"

while [ $F -lt 4 ]       //while循環體次數,大於4,程序結束

do

 read E

 let F++          

case "$E" in


A)

if [ $F -ne 4 ]           //if雙分支語句和case分支語句套用

then

 echo "禽獸!"

echo "$G!"

else

 echo "禽獸!歡迎下次再來哦!"

fi


B)

if [ $F -ne 4 ]

then

 echo "禽獸不如!"

 echo "$G!"

else

 echo "禽獸不如!歡迎回答笑笑問答!"

fi

;;


C)

if [ $F -ne 4 ]

then

 echo "比禽獸還禽獸!"

 echo "$G"

else

 echo "比禽獸還禽獸!歡迎回答笑笑問答!"

fi

;;


D)

if [ $F -ne 4 ]

then

echo "不但不如禽獸,還是個蠢貨!"

echo "$G"

else

echo "不但不如禽獸,還是個蠢貨!拜拜哦!"

fi  

;;

*)        //默認模式

echo "請您做出正確選擇!"

esac        //case 分支語句結束

done       //while 循環語句結束

                     Shell 語法


if 語句

for 循環語句

while 循環語句

case 分支語句










語法格式

if [條件測試操作1]

then

 命令序列1

elif [條件測試2]

then

 命令序列2

else

 命令序列3

fi


for 變量名 in 取值列表

do

命令序列

done


while 條件測試操作

do

命令序列

done


case 變量值 in

模式1

  命令序列1

;;

模式2

 命令序列2

;;

......

* )      

默認命令序列

esac





說明


if語句是最爲常用的一種流程控制方式,用來根據特定的條件測試結果,分別執行不同的操作(如果.......那麼......


指定一個變量及可能的取值列表,針對每一個不同的取值,重複執行相同的命令序列,直到變量值用完退出循環


根據特定的條件反覆執行一個命令序列,直到改條件不再滿足爲止


case語句可以使腳本程序的結構更加清晰,層次分明
















適用場合

適用於選擇執行的命令語句較多時

適用於列表對象無規律,且列表來源已固定(如某個列表文件)

適用於控制循環次數、操作對象按數字順序編號,按特定條件執行重複操作

適用於某個變量存在多種取值,需要對其中的每一種取值分別執行不同的命令序列,與多分支if 語句非常相似,只不過if語句需要判斷多個不同的條件,而case語句只是判斷一個變量的不同值






小技巧


取值列表中:

[1....9] 表示一個範圍

``  直接把命令結果傳遞給前面變量名

while true()

while false(假)    

while true等同於while :

let XIAO++(等同於XIAO=`expr $XIAO + 1`

exit 0 退出

break 強制退出


模式字符串中:

[0-9]  表示一個連續範圍

|    表示A|B


















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