一篇博客學會shell腳本

經過本章學習咱們能夠學會如下內容:
linux

一 什麼是shell以及shell的好處
shell

二 shell腳本的格式以及變量的使用方法編程

三 test測試語句和if流程控制vim

四 case-for-while語句的使用方法bash

五 中雙小括號的使用方法編程語言

六 循壞嵌套使用方法ide



一 什麼是shell以及shell的工做方式:oop

shell簡單來講能夠當作人與計算機之間的翻譯官,他做爲用戶與linux系統內部的通訊媒介,除了可以支持各類變量與參數外,還能夠提供循壞、分之等高級編程語言纔有的控制結構特性。
學習

shell的工做方式有二種測試

交互式:用戶每輸入一條命令就當即執行。

批處理:用戶先編好一個完整的shell腳本,shell會一次執行腳本的多個命令。


二 shell腳本的格式以及變量的使用方法

建立shell腳本的步驟:

第一步:建立一個包含命令和控制結構的shell文件,通常是後綴.sh

第二部:修改文件的權限使它能夠執行,通常使用chmod U+x 再加文件名

第三步:執行腳本
        方法一: ./加腳本名稱(經常使用這一種)

        方法二:使用絕對路徑

        方法三:bash加文件名


舉例說明:建立一個腳本,查詢一下他的路徑和包含的文件內容。

  1. [root@baiyijie jiaoben]# vim example01.sh   建立腳本名稱

  2. [root@baiyijie jiaoben]# chmod +x example01.sh加上執行權限

  3. [root@baiyijie jiaoben]# ./example01.sh   運行腳本

  4. our first example


  5. we are currently in the following directory.

  6. /root/jiaoben


  7. this directory contains the following files

  8. example01.sh

  9. [root@baiyijie jiaoben]# cat example01.sh查看腳本內容

  10. #!/bin/bash

  11. #this is to show what a example looks like.

  12. echo "our first example"

  13. echo # this inserts an empty line in output .

  14. echo "we are currently in the following directory."

  15. pwd

  16. echo

  17. echo "this directory contains the following files"

  18. ls



shell變量的使用方法:

用戶定義變量:由字母或者下劃線開頭,由字母或者下劃線組成,大小寫字母意義不一樣,變量長度沒有限制。

使用變量值時:要在變量名前加上前綴"$"

舉例說明:2VAR就是非法變量

變量賦值:賦值號 = 二邊沒有空格

舉例說明:

[root@localhost ~]# A=aaa變量賦值這種正確的

[root@localhost ~]# A = AAA  這種錯誤

-bash: A: command not found

[root@localhost ~]# echo $A 使用變量

aaa

[root@localhost ~]# A=`date` 將一個命令的執行結果賦予變量注意加``

[root@localhost ~]# echo $A

Thu Mar 22 10:33:58 CST 2018

[root@localhost ~]# B=$(ls -l)   B的變量賦值就是一個ls -l的命令

[root@localhost ~]# echo $B

total 40 -rw-------. 1 root root 1409 Mar 14 22:00 anaconda-ks.cfg -rwxr-xr-x. 1 root root 75 Mar 16 15:26 backup.sh -rwxr-xr-x. 1 root root 115 Mar 19 16:00 baojing.sh -rwxr-xr-x. 1 root root 195 Mar 16 17:00 caipiao.sh drwxr-xr-x. 2 root root 24 Mar 22 10:11 jiaoben drwxr-xr-x. 4 root root 49 Mar 19 20:38 lianxi -rwxr-xr-x. 1 root root 184 Mar 20 15:46 mizhi.sh -rwxr-xr-x. 1 root root 113 Mar 20 15:05 pingfang.sh -rwxr-xr-x. 1 root root 235 Mar 20 21:26 sanjiao.sh -rwxr-xr-x. 1 root root 44 Mar 19 14:17 shifen.sh -rwxr-xr-x. 1 root root 92 Mar 19 15:53 wokao.sh -rwxr-xr-x. 1 root root 112 Mar 20 15:19 xingqitian.sh drwxr-xr-x. 2 root root 6 Mar 18 13:48 zuoye

[root@localhost ~]# A=$B    A賦值變量B的內容

[root@localhost ~]# echo $A     

total 40 -rw-------. 1 root root 1409 Mar 14 22:00 anaconda-ks.cfg -rwxr-xr-x. 1 root root 75 Mar 16 15:26 backup.sh -rwxr-xr-x. 1 root root 115 Mar 19 16:00 baojing.sh -rwxr-xr-x. 1 root root 195 Mar 16 17:00 caipiao.sh drwxr-xr-x. 2 root root 24 Mar 22 10:11 jiaoben drwxr-xr-x. 4 root root 49 Mar 19 20:38 lianxi -rwxr-xr-x. 1 root root 184 Mar 20 15:46 mizhi.sh -rwxr-xr-x. 1 root root 113 Mar 20 15:05 pingfang.sh -rwxr-xr-x. 1 root root 235 Mar 20 21:26 sanjiao.sh -rwxr-xr-x. 1 root root 44 Mar 19 14:17 shifen.sh -rwxr-xr-x. 1 root root 92 Mar 19 15:53 wokao.sh -rwxr-xr-x. 1 root root 112 Mar 20 15:19 xingqitian.sh drwxr-xr-x. 2 root root 6 Mar 18 13:48 zuoye

[root@localhost ~]# A=date    看這裏不加``會有什麼後果

[root@localhost ~]# echo $A

date    只輸出date

這裏要說一下單引號和雙引號的區別:

單引號之間的內容原封不動的指定給了變量

雙引號取消了空格的做用,特殊符號的含義保留。

列出全部的變量用set


位置變量和特殊變量


位置變量:shell 解釋執行用戶的命令時,將命令執行的第一個字做爲命令名,而其餘字做爲參數,由出如今命令行上的位置肯定的參數稱爲位置參數。位置變量:使用$N來表示。

舉例說明:

[root@localhost ~]# ./example.sh file1 file2 file3

$0 這個程序的文件名 example.sh

$n 這個程序的第n個參數值。n=1..n

特殊變量:

有些變量一開始執行腳本的時候就會設定,且不能被修改,但咱們不叫它只讀的系統變量,而叫它特殊變量,這些變量當一執行程序就有了,如下是一些特殊變量:

$*這個程序的全部參數

$#這個程序參數的個數

$$這個程序的PID

$!執行上一個後臺程序的PID

$?執行上一個指令的返回值

舉例說明:寫一個腳本表示出程序的全部參數進程ID和程序參數的個數。

  1.  [root@baiyijie jiaoben]# vim z.sh

  2. [root@baiyijie jiaoben]# chmod +x z.sh

  3. [root@baiyijie jiaoben]# ./z.sh

  4. 表示這個程序的全部參數

  5. 0 表示這個程序的參數的個數

  6. 3486 表示程序進程的ID

  7. 3488 執行上一個就太指令的PID

  8. 3486 表程序的進程ID

  9. [root@baiyijie jiaoben]# ./z.sh aaa bbb ddd  cccc加入一些參數

  10. aaa bbb ddd cccc 表示這個程序的全部參數

  11. 4 表示這個程序的參數的個數

  12. 3489 表示程序進程的ID

  13. 3491 執行上一個就太指令的PID

  14. 3489 表程序的進程ID

  15. [root@baiyijie jiaoben]# cat z.sh查看腳本

  16. #!/bin/bash

  17. echo "$* 表示這個程序的全部參數"

  18. echo "$# 表示這個程序的參數的個數"



  19. touch /tmp/a.txt

  20. echo "$$ 表示程序進程的ID"



  21. touch /tmp/b.txt &

  22. echo "$! 執行上一個就太指令的PID"

  23. echo "$$ 表程序的進程ID"



三 test測試語句和if流程控制

&& 表明條件性的AND

|| 表明條件性的OR

test也能夠寫成[]

數值測試:-gt 是否大於

          -ge 是否大於等於

          -eq 是否等於

          -ne 是否不等於

          -lt 是否小於

          -le 是否小於等於

IF語法:

if條件

then

語句

fi

 擴展; 分號,表示二個命令寫在一行,互不影響。

if語法:

if 條件 ;then

  命令1

else

  命令2

fi



舉例說明;寫一個腳本,能夠判斷他是目錄,或者是普通文件,或者是設備文件。

  1. [root@localhost ~]# vim fuza.sh

  2. [root@localhost ~]# chmod +x fuza.sh

  3. [root@localhost ~]# ./fuza.sh      執行腳本

  4. ./fuza.sh: line 1: i#/bin/bash: No such file or directory

  5. input a file name    讓我輸入一個文件名

  6. /etc                  輸入/etc

  7. /etc is a dir         系統判斷他是一個目錄

  8. [root@localhost ~]# ./fuza.sh

  9. ./fuza.sh: line 1: i#/bin/bash: No such file or directory

  10. input a file name

  11. /etc/passwd

  12. /etc/passwd is file

  13. [root@localhost ~]# ./fuza.sh

  14. ./fuza.sh: line 1: i#/bin/bash: No such file or directory

  15. input a file name

  16. hhhk

  17. hhhk is an unknow file

  18. [root@localhost ~]# ./fuza.sh

  19. ./fuza.sh: line 1: i#/bin/bash: No such file or directory

  20. input a file name

  21. /dev/sda

  22. /dev/sda is a device file      說它是一個設備文件

  23. [root@localhost ~]# cat fuza.sh

  24. i#/bin/bash

  25. echo "input a file name"

  26. read file_name

  27. if [ -d $file_name ] ; then

  28. echo "$file_name is a dir"

  29. elif [ -f $file_name ] ;then

  30. echo "$file_name is file"

  31. elif [ -c $file_name -o -b $file_name ] ; then

  32. echo "$file_name is a device file"

  33. else

  34. echo "$file_name is an unknow file"

  35. fi


四 case-for-while語句的使用方法

case: 流程控制語句,適用於多分支。

格式:

case 變量 in

字符串1)命令列表1

;;

....

字符串n)命令列表n

;;

esac

blob.png


舉例說明:

製做一個菜單,能夠選擇bcd,分別表明backup copy delete

blob.png

文字部分

  1. [root@localhost lianxi]# vim case.sh

  2. [root@localhost lianxi]# chmod +x case.sh

  3. [root@localhost lianxi]# ./case.sh     執行腳本

  4. ****************************

  5. Please selet you operation:

  6. 1 Copy

  7. 2 Delete

  8. 3 Backup

  9. *****************************

  10. C                 我輸入C

  11. your seletion is copy  說我選擇的是copy

  12. [root@localhost lianxi]# ./case.sh

  13. ****************************

  14. Please selet you operation:

  15. 1 Copy

  16. 2 Delete

  17. 3 Backup

  18. *****************************

  19. D

  20. your seletion is delete

  21. [root@localhost lianxi]# ./case.sh

  22. ****************************

  23. Please selet you operation:

  24. 1 Copy

  25. 2 Delete

  26. 3 Backup

  27. *****************************

  28. B

  29. your seletion is backup

  30. [root@localhost lianxi]# cat case.sh

  31. #!/bin/bash

  32. echo "****************************"

  33. echo "Please selet you operation:"

  34. echo " 1 Copy"

  35. echo " 2 Delete"

  36. echo " 3 Backup"

  37. echo "*****************************"

  38. read op

  39. case $op in

  40. C)

  41. echo "your seletion is copy"

  42. ;;

  43. D)

  44. echo "your seletion is delete"

  45. ;;

  46. B)

  47. echo "your seletion is backup"

  48. ;;

  49. *) # 參數*, 匹配全部參數。

  50. echo "invalide selection"

  51. ;;

  52. esac


whlie 是循壞語句,用在循壞中

格式:

while 條件

do

命令

done

話很少說,繼續舉例說明:

算出一到十的平方,用腳本寫出來。

腳本內容:

blob.png

文字說明:

  1. [root@localhost ~]# vim pingfang.sh

  2. [root@localhost ~]# chmod +x pingfang.sh

  3. [root@localhost ~]# ./pingfang.sh

  4. 1

  5. 4

  6. 9

  7. 16

  8. 25

  9. 36

  10. 49

  11. 64

  12. 81

  13. 100

  14. [root@localhost ~]# cat pingfang.sh

  15. #!/bin/bash

  16. num=1

  17. while [ $num -le 10 ]      當變量小於10的時候執行下面的動做

  18. do 

  19. square=`expr $num \* $num`     變量的值相乘。中間要用轉移符

  20. echo $square

  21. num=`expr $num + 1`     每次執行加一下

  22. done




五 中雙小括號的使用方法

使用(())擴展shell中算數運算的使用方法,使用[]的時候,必須保證運算符與算數之間有空格,四則運算也只能藉助expr命令來完成,咱們今天的說的(())結構語句,就是對shell中算數及賦值運算的擴展。

舉例說明:

依次輸出小於100之內2的冪值,輸出的結果應該爲:2 4 8 16。

腳本的內容:

blob.png

文字解釋:

  1. [root@localhost ~]# vim mizhi.sh

  2. [root@localhost ~]# chmod +x mizhi.sh

  3. [root@localhost ~]# ./mizhi.sh

  4. the while loop example

  5. value of the variable is : 1

  6. value of the variable is : 2

  7. value of the variable is : 4

  8. value of the variable is : 8

  9. value of the variable is : 16

  10. value of the variable is : 32

  11. value of the variable is : 64

  12. the loop execution is finished

  13. [root@localhost ~]# cat mizhi.sh  查看一下腳本內容

  14. #!/bin/bash

  15. echo "the while loop example"

  16. echo

  17. var1=1

  18. while ((var1<100))  注意這裏能夠省去$

  19. do

  20.       echo "value of the variable is : $var1"

  21.     ((var1=var1*2))  這裏也是能夠省去$

  22. done

  23. echo

  24. echo "the loop execution is finished"




 六 循壞嵌套使用方法

顧名思義就是在一個腳本中使用循壞嵌套來實現更簡單的用法。

舉例說明;使用特殊符號打印三角形。要求整個程序要有交互,運行時能夠自動輸入打印的行數和用於描繪三角形的特殊符號。

腳本內容:

blob.png


文字解釋

  1. [root@localhost ~]# vim sanjiao.sh

  2. [root@localhost ~]# chmod +x sanjiao.sh

  3. [root@localhost ~]# ./sanjiao.sh

  4. please enter the line number:6

  5. please enter the char number:*

  6. *

  7. **

  8. ***

  9. ****

  10. *****

  11. ******

  12. [root@localhost ~]# cat sanjiao.sh

  13. #!/bin/bash

  14. read -p "please enter the line number:" line

  15. read -p "please enter the char number:" char

  16. a=1

  17. while [ $a -le $line ]

  18. do

  19.       b=1

  20.       while [ $b -le $a ]   當變量b的值小於等於變量a的值時,執行do

  21.     do

  22.         echo -n "$char"  輸出

  23.         b=`expr $b + 1`  變量b的值加一

  24.     done

  25.     echo

  26.     a=`expr $a + 1`

  27. done

  28. [root@localhost ~]#



寫了這麼多,你也看出來了。沒有什麼捷徑,捷徑就是一天一個腳本,遲早你就會成功。

相關文章
相關標籤/搜索