bash腳本編程

編程語言:

編譯器积仗,解釋器
編程語言:機器語言则奥,匯編語言蕊爵、高級語言
靜態(tài)語言:編譯型語言
強類型(變量)
關(guān)鍵字:
事先轉(zhuǎn)換成可執(zhí)行格式
c,c++,JAVA,C#
動態(tài)語言:解釋型語言 on the fly
弱類型
邊解釋變執(zhí)行
php,shell,python,perl(面向過程)

?
面向?qū)ο螅簊hell,c
面向?qū)ο螅篔AVA恼布,Python,perl搁宾,C++

?
bash:腳本解釋器

編程能力:
腳本編程

變量:內(nèi)存空間折汞,命名的內(nèi)存空間(可以回收)
內(nèi)存:編址的存儲單元

進程:臨時存儲數(shù)據(jù)要用到變量

映射表:變量名和物理地址的映射

變量類型:
事先確定數(shù)據(jù)的存儲格式和長度
字符
數(shù)值
整型
浮點型:11.23(1.12310^1)(0.112310^2)
2013/10/10
布爾型:真假型 邏輯

邏輯運算:與、或盖腿,非爽待、異或(相同為假损同,不同為真)
&, !
短路邏輯運算
與:其中一個為假鸟款,結(jié)果為假
或:其中一個為真膏燃,結(jié)果為真。

shell:弱類型編程語言

強:變量在使用前何什,必須事先聲明组哩,甚至還需要初始化:
弱類型編程語言:變量用時聲明,甚至不區(qū)分類型:(默認為字符)

顯式轉(zhuǎn)換处渣,隱式轉(zhuǎn)換
1+c=(ASCII)

10:16bit
10:1010伶贰,8bit

整型:8bit,256
0-255;溢出
緩沖區(qū)溢出:攻擊(填入數(shù)據(jù)前罐栈,先判斷)

變量賦值:var_name=value

bash變量類型:
環(huán)境變量
本地變量(局部變量)
位置變量
特殊變量

本地變量:(作用域當前bash)
變量聲明: varname=value

局部變量(作用域為當前代碼)
local varname=value

 bash:進程的變量
 echo $VAR_name

引用變量:${VARNMAE} $varname(防止混淆要用{})
''強引用
“” 弱引用
環(huán)境變量(作用域為當前shell進程及其子進程)

export varname=value
  “導出”
  varname=value
  export varname

腳本在執(zhí)行時會啟動一個子shell進程,
命令行中啟動的腳本就會繼承當前shell環(huán)境變量
系統(tǒng)自動執(zhí)行的腳本(非命令行啟動)就需要自我定義需要各環(huán)境變量黍衙。

位置變量:
$1,$2,$3,......

特殊變量:
$?:上一個命令的執(zhí)行狀態(tài)返回值(回傳碼)
程序執(zhí)行結(jié)果
程序狀態(tài)返回代碼(0-255)
0:表示正確
1-255:表示錯誤 1,2,127系統(tǒng)預留
id 用戶
echo $?

輸出重定向:

<
2>
2>>
&>

/dev/null:設備,軟件設備(軟件模擬) 悠瞬,bit bucket们豌,數(shù)據(jù)黑洞

id student &> /dev/null
echo $?

撤銷變量:

set (省略)
unset  varname

查看當前shell的變量:(本地變量,環(huán)境變量)

  set   (所有變量)
查看當前shell中的環(huán)境變量
printenv
env
export

變量添加

animal=$animal:goat
animal=$animal:shell
export PATH=$PATH:/usr/local/apache/bin
export PATH=/usr/local/apache/bin/:$PATH

默認為字符串

腳本:命令的堆砌浅妆,按實際需求望迎,結(jié)合命令流程控制機制實現(xiàn)的源程序。

ELF:可執(zhí)行的鏈接的二進制文件凌外。

shebang:魔數(shù)
#!/bin/bash(可執(zhí)行程序的路徑)
#:注釋行辩尊,不執(zhí)行
chmod +x *.sh
./*.sh(獨立執(zhí)行)


bash *.sh   (可以沒有執(zhí)行權(quán)限)

練習:寫一個腳本:

1.添加5個用戶,user1康辑,user5
2.每個用戶的密碼同用戶名摄欲,而且,添加密碼完成后不顯示passwd命令的執(zhí)行結(jié)果
3.每個用戶添加完成后疮薇,都要顯示用戶某某已完成胸墙。
練習:寫一個腳本:
1.使用一個變量保存一個用戶名
2.刪除此變量中的用戶,且一并刪除其家目錄
3.顯示“用戶刪除完成”類的信息按咒。

條件判斷:
如果用戶不存在
添加用戶迟隅,給密碼并顯示添加成功。
否則
顯示已經(jīng)存在励七,不添加智袭。
bash中如何實現(xiàn)條件判斷:
條件測試類型:
整數(shù)測試
字符測試
文件測試

條件測試的表達式:
[ expression ] (注意空格)
[[ expression ]]
test expression

整數(shù)比較:

  -eq:測試兩個整數(shù)是否相等:比如   [ $A -eq  $B ]  echo $?
  -ne:測試兩個整數(shù)是否不等,不等為真掠抬,相等為假 
  -gt:測試一個數(shù)是否大于一個數(shù):大于為真吼野,小于為假
  -lt:測試一個數(shù)是否小于 一個數(shù)。
  -ge:測試一個數(shù)是否大于等于一個數(shù)
  -le:小于等于

命令間邏輯關(guān)系:
邏輯與: &&
第一個條件為假時两波,第二個條件不用再判斷了瞳步,最終結(jié)果已經(jīng)有了
第一個條件為真時闷哆,第二個條件必須判斷。
邏輯或:|| 第一個條件為假時谚攒,第二個條件判斷
第二個條件為真時阳准,第二個條件不判斷
(短路操作)
id user01 && echo "hello,user1"
id user1 || useradd user1

變量名稱:
1.只能包含字母、數(shù)字馏臭、下劃線野蝇、并且不能數(shù)字開頭
2.變量名不能和系統(tǒng)變量同名
3.最好做到見名知義。

    ! id user2 && useradd user2
[ $FINELINE -gt 100 ] && echo "/etc/inittab is a big file " || echo "/etc/inittab is a small file"

id user1 && echo "user is exists" || useradd user
! id user && useradd user && echo "user exits"
! id userr &&  useradd user && echo "nihao"  | passwd --stdin user  || echo "user is exits" 
如果用戶存在括儒,就顯示用戶已存在绕沈;否則,就添加此用戶帮寻;
id user1 && echo "user1 exists." || useradd user1

如果用戶不存在乍狐,就添加;否則固逗,顯示其已經(jīng)存在浅蚪;
! id user1 && useradd user1 || echo "user1 exists."

如果用戶不存在,添加并且給密碼烫罩;否則惜傲,顯示其已經(jīng)存在;
! id user1 && useradd user1 && echo "user1" | passwd --stdin user1  || echo "user1 exists."

條件判斷:控制結(jié)構(gòu):
單分支if語句:
if 判斷條件 ; then (如果then 和 if 不在一行  可以省略;)
     statement1
     statement2
     ....
fi 

雙分支的if語句:
if 判斷條件 贝攒; then
    statement1
    statement2
    ....
    else
    statememt3
    ...
fi 

        userid=`id -u $username` 
    if [ $userid -eq 0] ;then
         echo "it is admin"
         else
           echo  "it is not admin"
    fi

if id $name ;then
    判斷用戶是否存在
    
    
#!/bin/bash
username=user1
userid=`id -u $useranme`
groupid=`id -g $useranm`
if [ $userid -eq $groupid ] ;then
  echo "good guy"
  else
       echo "bad guy"
fi

shell中進行算術(shù)運算:

a=1
b=2 
let: 讓字符轉(zhuǎn)換成數(shù)值進行算術(shù)運算
1.let 算術(shù)運算表達式
   let c=$a+$b 
2.$[算術(shù)運算表達式]
  c=[$a+$b]
3.$((算術(shù)運算表達式))
   c=(($a+$b)
4.expr 算術(shù)運算表達式   (注意表達式中各操作數(shù)及運算符之間要有空格) 
c=`expr $a + $b`

提前結(jié)束腳本

  exit:退出腳本盗誊。可以自定義回傳碼(命令執(zhí)行狀態(tài)碼)隘弊,沒有跟數(shù)字哈踱,默認最后一次執(zhí)行的狀態(tài)碼。
   exit 數(shù)值#

測試方法:

[  expression ]命令 
[[ expression ]] 關(guān)鍵字 
test expresión

bash常見的測試有三種:
整數(shù)測試:

-gt
-le;
-ne
-eq
-lt
-ge:

[ $a -eq 4b ]
[[ $a -eq $b ]]
test $a -eq $b

 
文件測試:
-e file   :測試文件是否存在
-f  file   測試文件是否為普通文件
-d file    測試文件是否為目錄
-r  file   測試當前用戶對指定文件是否有讀取的權(quán)限
-w   file  
-x   file 
 [  -e /etc/inittab ]
 [ -w /etc/rc.d/rc/sysconfig ]   
 
if [ ! -e $FILE ];then 
 echo ""
  exit 0

圓整:丟棄小數(shù)點后的數(shù)梨熙。

多分支的if語句

if 判斷條件1; then
  statement1
  .......
  elif  判斷條件2;then
      statement2
      ......
      elif   判斷條件3;then
           statement3
           ...
        else
           statement4
           ....
fi

測試腳本是否有語法錯誤:

bash -n file.sh
bash -x 腳本  單步執(zhí)行命令

編寫一個腳本

給定一個文件开镣,如果是普通文件,就顯示
如果是目錄咽扇,就顯示目錄哑子,否則此為不能識別。

#!/bin/bash

FILE=/etc/rc.d/rc.sysconfig
if [ ! -e $FILE ];then
    echo "NO such file"
fi
if  [ -f $FILE ];then
   echo "common file"
   elif [ -d $FILE ];then
      echo "$FILE is directory "
      else
        echo "UNknown"
fi

定義退出狀態(tài)碼
exit:退出腳本
exit #
如果腳本沒有明確定義退出狀態(tài)碼肌割,那么執(zhí)行最后一條命令的的狀態(tài)碼即為腳本的退出狀態(tài)碼。

bash變量的類型:

本地變量(局部變量):作用域只是當前shell
環(huán)境變量:作用域是當前shell帐要,及其子shell
位置變量:$1,$2,$3....

shift:輪替 位置參數(shù)的輪替把敞。
 #!/bin/bash
 echo $1
 shift
 echo $
 shift
 echo $1 
 shift
 
 shift #:一下輪替n個
 

 
./filetest.sh  /etc/fstab /etc/inittab
$1: /etc/fstab
$2: /etc/inittab

特殊變量:

$?:
$#:參數(shù)的個數(shù)
$*:參數(shù)列表
$@:參數(shù)列表

練習:寫一個腳本

能接受一個參數(shù)(文件路徑)
判定:此參數(shù)

#!/bin/bash

if [ $# -eq 0 ];then
echo""
 exit 0
if [ ! -e $1  ];then
    echo "NO such file"
fi
if  [ -f $1  ];then
   echo "common file"
   elif [ -d $1  ];then
      echo "$1  is directory "
      else
        echo "UNknown"
fi   

特殊變量:

$?:
$#:參數(shù)的個數(shù)
$*:參數(shù)列表
$@:參數(shù)列表

字符串測試:

==或=:   [ $a == $b ]  (等號兩端要有空格)
!=:測試是否不等,不等為真榨惠,相等為假奋早。
>
<
=>
<=

-n string :測試指定字符串是否為空盛霎,空為真,不空為假耽装。
-s  string :測試指定字符串是否為空愤炸,空為假,不空為真掉奄。

#!/bin/bash
if ! id $1 &> /dev/null;then
      echo "no user"
        exit 1
fi
if [ `id -n -u $1` == `id -n -g $1` ];then
   echo      "yiyang"
   else
         "buyiyang"
fi

if  [ $1 == "q" ];then
    echo "quiting..."
   exit 1
   elif [ $1 == 'Q' ];then
     echo "quiting.."
     exit 2
     esle 
     exit 3
fi

echo "scale=2;111/22;" | bc
bc <<<  "scale=2;111/22;"(注意3個小于號)

循環(huán):進入條件规个,退出條件

for
while
until

for   變量 in 列表;do
       循環(huán)體
     done

for i in 1 2 3 4 5 6 7 8 9 10;do
    加法運算
    done
    
    遍歷完成后,退出姓建。


如何生成列表:
{1..100}
seq  起始數(shù) 步進長度  結(jié)束數(shù)


#!/bin/bash

let sum=0
for i in {1..100};do
   let sum=$sum+$i
done 
echo "$sum"

decalre -i sum

declare  
  -i:整型 
  -x :聲明為環(huán)境變量
  
取模诞仓,取余 %

測試:

整數(shù)測試:
  -le
  -lt
  -ge
  -gt
  -eq
  -ne
字符測試:
  ==
 !=
  >
  <
  -n
  -z
文件測試:
 -f 
  -d
 -r
  -x
 -w
  -e 
if [ $# -gt 1 ];then
組合測試條件:
    -a:與關(guān)系
    -o:或關(guān)系
     K偻谩:非關(guān)系

if [ $# -gt 1 -a $# -le 3  ]
if [ $# -gt 1 ] && [ $# -le 3 ]

Q,q,quit 
if [ $1 == q -o $1 == Q  -o  $1 == quit -o $1 == Quit ];then
        echo "quiting"
       exit 1
fi

let i=$[$i+1]
let sum=$[$sum+$i]
let sum+=$i

let i+=1 
let i++

-=  i--
*=
/=
%=

++i,--i  

面向過程:
控制結(jié)構(gòu):
順序結(jié)構(gòu)
選擇結(jié)構(gòu)
循環(huán)結(jié)構(gòu)
選擇結(jié)構(gòu):
if:單分支墅拭、雙分支的,多分支
if condaiction;then
statment
.....
fi

if condation;then
statment
....
else
....
fi

if condation;then
statment
..
elif condation;then
statment;
....
fi

case語句:選擇結(jié)構(gòu)

case switch in
value)
statment
....
;;
value2)
statment
....
;;
*)
statment
.....
;;
esac

由鍵盤輸入一個字符涣狗,給出判斷?

case.sh
#!/bin/bash

case $1 in
[0-9]) 
   echo "a digtal";;
[a-z]) 
    echo "lower";;
[A-Z])
  echo "upper";;
  *)
    echo "unknown";;
esac

只接受參數(shù)谍婉,start,stop镀钓,restart,status

#!/bin/bash
 case $1 in 
 'stat')
    echo "start server...";;
'restart')
   echo "restart server...";;
 'stauts')
   echo "stuts service...";;
   *)
     echo "`basename $0` {start |stop |restart |status}";;
     esac
     
#穗熬!/bin/bash
case $1 in
-y|--verbose)
  debug=1 
  ;;
  *)

腳本編程:
順序結(jié)構(gòu)
選擇結(jié)構(gòu)
if:單分支、雙分支的掸宛,多分支
case
循環(huán)結(jié)構(gòu):
for
while
until

while循環(huán):適用于循環(huán)次數(shù)未知的情況下,必須要有退出條件死陆。
語法: 
     while condition ; do 
          statemant
          ....
          done 
計算100以內(nèi)正整數(shù)的和:
#!/bin/bash 
declare  -i i=1 
declare -i sum=0 
 while [ $i -le 100  ];do
    let sum+=$1 
      let $i+=1
    done

    
  read -p "please input string" string 
while [  $string != 'quit' ];do
     echo $string |tr 'a-z'  'A-Z'
     read -p "please input string "string 
     done 
    
    
    
while [ 1 -eq 1 ] 
or
while true
or
while ((1))
or
while [[ 1 ]]
or 
while :  


while循環(huán) 
while ,until,for 
break:提前退出循環(huán)
continue:退出本次循環(huán)唧瘾,進行下一次循環(huán)措译。

while的特殊用法一:
while : ;do

done 
while的特殊用法二:
while read LINE;do

done </path/to/somefile

函數(shù):功能 function

代碼重用:

庫:so

函數(shù):就是把其中某個特定的功能的代碼封裝起來,進行調(diào)用饰序。
定義函數(shù):
function FUCname {
    command

}
FUncname() {
command

}

function showmenu {
}
函數(shù)不能直接執(zhí)行领虹,必須調(diào)用才行。
showmenu

自定義狀態(tài)返回值
return #

#!/bin/bash
ADD() {
a=9
b=7
let c=$a+$b`
echo $c
}
ADD
sum=`ADD`
echo $sum
let m=1
sm=$[$m+`ADD`]  #函數(shù)執(zhí)行結(jié)果引用  ``

ADD 
echo $?    執(zhí)行狀態(tài)結(jié)果 
bash -x *.sh 逐步執(zhí)行顯示
注意:執(zhí)行結(jié)果求豫,狀態(tài)結(jié)果

函數(shù)的執(zhí)行狀態(tài)結(jié)果是最后一條命令的執(zhí)行結(jié)果的狀態(tài)返回值塌衰。

自定義狀態(tài)返回值
return  #
0--255

if [ $? -eq 0 ];then
echo ""
else 
   fi
根據(jù)返回結(jié)果判斷程序執(zhí)行成功與否

接受參數(shù)的函數(shù):
./a.sh aa bb cc
位置參數(shù):
$1:
$2:
函數(shù)的參數(shù):
ADD 5 6
$1 
$2 :函數(shù)參數(shù)

ADD(){
  echo $[$1+$2]
}
ADD 5 6
sum=`ADD 5 6`
echo $sum 
echo "$i+$j=`ADD $i $j`"

#!/bin/bash
PING() {
    if ping -c 1 -W 1 $1 &> /dev/null; then
     return 0 
   else
    return 1 
  fi
}
for i in {200..254};do
  PING 192.168.0.$i
  if [ $? -eq 0 ];then 
    echo "192.168.0.$i is up"
    else 
    echo "192.168.0.$i is down"
    fi 
  done
for i in {220..254};do
  PING 172.16.0.$i
done

if ping 192.168.0.$i ;then
返回執(zhí)行狀態(tài)結(jié)果。 
``:引用echo結(jié)果
  

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蝠嘉,一起剝皮案震驚了整個濱河市最疆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚤告,老刑警劉巖努酸,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杜恰,居然都是意外死亡获诈,警方通過查閱死者的電腦和手機仍源,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舔涎,“玉大人笼踩,你說我怎么就攤上這事⊥鱿樱” “怎么了嚎于?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昼伴。 經(jīng)常有香客問我匾旭,道長,這世上最難降的妖魔是什么圃郊? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任价涝,我火速辦了婚禮,結(jié)果婚禮上持舆,老公的妹妹穿的比我還像新娘色瘩。我一直安慰自己,他們只是感情好逸寓,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布居兆。 她就那樣靜靜地躺著,像睡著了一般竹伸。 火紅的嫁衣襯著肌膚如雪泥栖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天勋篓,我揣著相機與錄音吧享,去河邊找鬼。 笑死譬嚣,一個胖子當著我的面吹牛钢颂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拜银,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼殊鞭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尼桶?” 一聲冷哼從身側(cè)響起操灿,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泵督,沒想到半個月后牲尺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年谤碳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溢豆。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜒简,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漩仙,到底是詐尸還是另有隱情搓茬,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布队他,位于F島的核電站卷仑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏麸折。R本人自食惡果不足惜锡凝,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垢啼。 院中可真熱鬧窜锯,春花似錦、人聲如沸芭析。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馁启。三九已至驾孔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惯疙,已是汗流浹背翠勉。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留螟碎,地道東北人眉菱。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像掉分,于是被迫代替她去往敵國和親俭缓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

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