BashShell基本腳本構建

1.構建基本腳本(第十一章)

1.簡單腳本與顯示消息

例1git

#!/bin/bash    #格式規定的第一句話,這行代碼的!後代表了腳本要用Bash shell執行
#分開寫兩行代碼,腳本會一次執行
date      #顯示當前時間
who      #顯示登錄帳戶
  • 剛寫好的腳本不能直接運行,須要賦予執行權限chmod u+x test.sh #賦予腳本執行權限
  • 賦予權限後,在命令行輸入:./test.sh # ./的意思是當前目錄

例2github

#!/bin/bash    
#echo  "文本"  則文本會在命令行中顯示,注意使用雙引號能夠避免不少麻煩
echo -n "當前時間:"   #使用 -n 命令可使date的結果和當前時間處在同一行
date     
echo  " 在線用戶"     # 普通的echo ,在線用戶本身獨佔一行 
who

2.使用變量

  • 在腳本中出現$,就意味着這是個變量,如$val1,反過來要表示美圓的話要加上轉義符號 $15 即爲15美圓shell

  • 用戶能夠本身定義變量,但有兩點注意:安全

    1. 區分大小寫 2. 變量、符號、值之間不能有空格,特別注意
  • 用戶變量能夠經過美圓符號引用bash

var1=10  #不能有空格
var2=$var1  #用$符號引用
  • 利用$()能夠從命令的輸出中提取信息,並將其賦值給變量:testing=$(date) #時間信息賦值給了testing
#常見用法,將日期加入文件名
#!/bin/bash
today=$(date +%y%m%d)             #提取時間信息中的年(y)月(m)日(d)
mv  test* test*.$today

3.重定向輸入與輸出以及管道

  • 輸出重定向(大於號>):將命令輸出發送到某個文件:date > text #將日期信息保存在text文件中
  • 若不想覆蓋文件則使用遠大於號>>,date>>text #將日期【添加】到text文件中
  • 輸入重定向(小於號<):將文件中的信息輸入到命令中
  • 使用內聯重定向(遠小於號<<)須要指定結束字符,經常使用EOF
var5=$(bc << EOF       #bc,shell的計算器,這段代碼計算了var1*var2+var3+var4的值,並取四位小數
scale = 4
a1 = ( $var1 * $var2 )
b1 = ($var3  * $var4 )
a1+b1
EOF
)
  • 管道,命令1的輸出做爲命令2的輸入。兩者同時進行
apt -list | sort >apt.list   #將apt包的列表排序並輸出到apt.list文件中

4.數學運算

  • 賊麻煩、注意空格
  • expr命令能夠進行整數計算(不推薦) ·expr 1 + 5 #空格不能省略
expr 1 * 5  #會報錯
expr 1 \* 5 #加上轉義符後,正確
  • 使用方括號執行運算會簡單不少
#如下兩行代碼是一個意思
[ 4  *1  ]
expr 4 \* 1
  • 要支持小數點必須使用 bc
#利用管道將echo命令的結果輸入到計算器bc中,返回結果
var1=$(echo "scale=4;3.14 / 5" | bc)  #scale能夠肯定小數位數但不是四捨五入而是去尾,切記

5.退出碼

  • echo $? #查看上一個命令的退出碼
  • 退出碼與錯誤有關,正常結束的爲0,也能夠設定退出碼,腳本中加入exit 5退出碼即爲5
  • 強制終止 CTRL+C

2.if-then 選擇結構(第十二章)

1.基本代碼 if -then -else

例1:less

#!/bin/bash
#if用法的基本舉例
if pwd      #if + 命令   若命令執行(退出碼爲0,或者說既判爲真?),則進行then
then
     echo " It worked"         #輸出  It worked,至於pwd的輸出,不會顯示出來的
fi                #if 語句結束

#另外一個例子
if wrong      #if + 命令   若命令不執行(退出碼不爲0,或者說既判爲否?),則跳過then
then
     echo " It worked"         #輸出  It worked,至於pwd的輸出,不會顯示出來的
fi                #if 語句結束

例2命令行

#!/bin/bash
# if -then -else          命令執行則then,不執行則else
testuser=NoSuchUser
#
if grep $testuser /etc/passwd
then
  echo "The bash files for user $testuser are:"
  ls - /home/$testuser/.b*
  echo           #輸出空一行
else
  echo "The user $testuser does not exist on the system"
  echo
fi

例3code

#!/bin/bash
#嵌套的高級用法 elif ,實際上是:else+if
testuser=NoSuchUser
#
if grep $testuser /etc/passwd
then
  echo "The user $testuser exists on the system"

elif ls -d /home/$testuser           #else後面接if,連寫的話會很方便
then
  echo "The user $testuser does not exist on the system"
  echo "However ,$testuser has a directory"
fi

2.test命令(比較、判斷)

  • if-then語句只能判斷退出碼。但利用test語句,能夠判斷真假
  • test語句能夠用方括號 [ ] 簡寫,和計算同樣,注意方括號先後要有空格
  • test能夠進行數值比較,但只能比較整數
#數值比較功能
#eq 爲=  g爲greater   l大概爲less
[ n1 -eq  n2 ]      #n1=n2
[ n1 -ge  n2 ]      #n1>=n2
[ n1 -gt   n2 ]      #n1>n2
[ n1 -le   n2 ]      #n1<=n2
[ n1 -lt    n2 ]      #n1<n2
[ n1 -ne  n2 ]      #n1!=n2
  • test能夠進行字符串比較
#字符串比較功能
#使用大於小於號必定要注意加上轉義號,不然會生成文件並斷定爲真
[ str1 = str2 ]          #比較字符串是否相同
[ str1 !=s tr2 ]        #比較字符串是否不一樣
[ str1 \< str2 ]       #字符串1是否比2小,注意轉義號
[ str1 \> str2 ]       #字符串1是否比2大,注意轉義號
[ -n str1 ]             #字符串長度是否爲非0
[ -z str1 ]             #字符串長度是否爲0
#test的比較大小和sort的正好反過來,由於test用的是標準ASCII順序
  • test 能夠進行文件比較(最經常使用的)
#能夠用來檢查系統中的文件,賊好用
[ -d file ]       #檢查file是否存在併爲一個目錄(dir)
[ -e file ]       #檢查file是否存(exist)
[ -f file ]        #檢查file是否存在併爲一個文件(file)
[ -r file ]        #檢查file是否存在並可讀(read)
[ -s file ]        #檢查file是否存在並不是空
[ -w file ]        #檢查file是否存在並可寫(write)
[ -x file ]         #檢查file是否存在並可執行
[  file1 -nt file2 ]  #檢查file1是否比file2新(newer then)
[  file1 -ot file2 ]  #檢查file1是否比file2舊(older then)
  • 使用雙括號能夠處理數學表達式,還不懂,不展開
  • 使用雙方括號能夠處理字符串,還不懂,不展開

3.case命令

  • 使用case能夠不停的檢查_同一個_變量
#!/bin/bash
#檢查用戶,對應的用戶有不一樣的輸出
case $USER in    #注意in
rich | barbara)       #注意)
  echo "Welcome, $USER"
  echo "Please enjoy your visit";;   #注意雙分號
testing)
  echo "Special testing account";;    #注意雙分號
Jessica)
  echo "Do not forget to log off when you're done";;   #注意雙分號
*)
  echo Sorry, you are not allowed here";;     #注意雙分號
esac     #反寫,結束

3.for、while、untill 循環結構(第十三章)

####1.for 命令排序

  • 使用for命令,可使用列表(或變量)中的值
#!/bin/bash
#
for test in "Beijing Nanjing Shanghai Guangzhou Jinan  Xi'an"  #把列表中的值依次賦值給test,又用到了in,另外雙引號是個好東西
do 
  echo "The next city is $test"
done     # 結束符號
  • 使用for命令,可使用文件中的值
#!/bin/bash
#
file="cities"  #cities 文件名。文件須要和腳本在同一目錄下
#
for test in $( cat $file) #讀取文件中的值
do 
  echo "The next city is $test"
done     
#但有時,文件中有空格,如New Shanghai,輸出就會當成New 和 Shanghai兩個,由於的字段分隔符爲空格
  • 字段分隔符 IFS。默認的字段分隔符爲:1.空格 2.製表符 3.換行符
  • IFS 是能夠在腳本中改變的
IFS=$'\n'             #以換行符爲字段分隔符
IFS=$'\n':;"          #以換行符、冒號、分號、雙引號爲字段分隔符
#
#若是須要屢次改變IFS,把默認的先存起來是個安全的好主意
IFS.OLD=$IFS
  • 可使用通配符如*來遍歷目錄
  • C語言風格的for命令是處理計數的神器,真好用
#!/bin/bash
#注意雙括號和分號
for (( i=1; i <=10 ;i++ ))     #從1開始,每次加1,到10中止
do 
  echo "The nest number is $i"
done
#
#還可使用多個變量哦,用逗號分隔
for (( a=1 , b=10; a <=10 ;a++ ,b-- ))     
do 
  echo " $a  -  $b"  #沒作計算,就是輸出
done

2.while 循環

  • 當test到否,while就中止循環
#!/bin/bash
#
var1=10
#
while [ $var1 -gt 0 ]   #若var1大於0則繼續
do
  echo $var1
  var1=$[ $var1 -1  ]   #計算減一,注意方括號先後的空格
done
  • while容許使用多個test命令(或者其餘命令),全部的test都會執行,哪怕那一次有個test沒有經過

3.unit 循環

  • 當test到until就中止循環
#!/bin/bash
#
var1=100
#
until [ $var1 -eq 0 ]
do
  echo $var1
  var1=$[ var1 -25 ]
done
  • 與while的區別是一樣到0結束,while的最後輸出有0,until則不包括0

4.其餘

  • 循環能夠嵌套,好好使用修改IFS的技術
  • 用break能夠退出循環,break是退出當下循環,break 2 是退出外面一層的循環,break 3是退出外面的外面一層的循環
  • 利用continue能夠跳過某些循環
#!/bin/bash
#這個腳本最後的輸出會跳過var1大於5小於10的部分
for ((var1 =1 ; var1<15 ;var1++ ))
do
  if [ $var1 -gt  5 ]  &&  [  $var -lt 10 ]
  then
      continue
  fi
  echo "The number is $var1"
done
#注意,continue不要和計數部分寫在一塊兒,會跳過計數形成死循環的
  • 循環的輸出,能夠在done後面進行處理:done | sort >test.txt 將循環輸出排序並保存在test.txt文件中

5.一個小例子

#!/bin/bash
#這個腳本在掃描PATH環境變量下全部有可執行文件的目錄,也就是電腦中全部安裝的程序
#輸出真多……
IFS=:
for folder in $PATH
do
  echo "$folder:"
  for file in $folder/*
  do
      if [ -x $file ]
      then
         echo "    $file"
      fi
   done
done

未完待續,有新想法再寫ci

相關文章
相關標籤/搜索