Shell編程入門


  • shell語法
  • shell變量
  • shell變量表達式
  • shell條件判斷語句if、case
  • shell循環控制語句for、while、until
shell語法
  • 開頭
  • 注釋
  • 執行命令 例如:使用vi編輯器創建/root/date文件,如下共有三行命令
  1. 創建文件
[root@localhost ~]# vi /root/date #!/bin/bash #filename:date echo "Mr.$USER,Today is:" echo $(date) echo Whish you a lucky day ! 

2.設置可執行權限

[root@localhost ~]# chmod u+x /root/date 

使用ls命令可以查看/root/date文件具有可執行權限

[root@localhost ~]# ls -l /root/date -rwxr--r--. 1 root root 95 Jul 18 18:25 /root/date 

3.輸入這個文件的完整路徑即可執行Shell程序

[root@localhost ~]# /root/date Mr.root,Today is: Thu Jul 18 18:37:48 EDT 2019 Whish you a lucky day ! 

4.使用bash命令執行程序(當使用bash執行程序時,就是告訴系統它是一個可執行腳本,不需要設置/root/date的可執行權限也可以執行)

[root@localhost ~]# chmod u-x /root/date [root@localhost ~]# ls -l /root/date -rw-r--r--. 1 root root 95 Jul 18 18:25 /root/date [root@localhost ~]# /root/date -bash: /root/date: Permission denied [root@localhost ~]# bash /root/date Mr.root,Today is: Thu Jul 18 18:44:42 EDT 2019 Whish you a lucky day ! 

Shell變量

1.常用環境變量

Shell環境變量 描述
HOME 用於保存用戶主目錄的完全路徑名
PATH 用於保存用冒號分割的目錄路徑名,Shell將按PATH變量中給出的順序搜索這些目錄,找到的第一個與命令名稱一致的可執行文件將被執行。
TERM 終端的類型
UID 當前用戶的UID,由數字構成
PWD 當前工作目錄的絕對路徑名,該變量的取值隨cd命令的使用而變化
PS1 主提示符,在root用戶下,默認得住提示符是“#”,在普通用戶下,默認的主提示符是“$”
PS2 在Shell接收用戶輸入命令的過程中,如果用戶在輸入行的末尾輸入“\”然后按回車鍵,或者當用戶按回車鍵時Shell判斷出用戶輸入的命令沒有結束時,就顯示這個輔助提示符,提示用戶繼續輸入命令的其余部分,默認的輔助提示符是“>”

例如:查看當前用戶Shell定義的環境變量的值

[root@localhost ~]# echo $HOME /root [root@localhost ~]# echo $PWD /root [root@localhost ~]# echo $PS1 [\u@\h \W]\$ [root@localhost ~]# echo $PS2 > [root@localhost ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@localhost ~]# echo $TERM xterm [root@localhost ~]# echo $UID 0 

2.定義用戶的變量 語法:變量名=變量值

注意:定義變量時,變量名前不應該家符合“$”,在引用變量的內容時則應在變量名前加符合“$”.在給變量賦值時,等號兩邊一定不能留空格,若變量中本身就包含了空格,則整個字符串都要用雙引號括起來。在編寫Shell程序時,為了使變量名和命令名相區別,建議所有的變量名都用大寫字母來表示。

例如:變量值中包含了空格,需將整個字符串用雙引號括起來

[root@localhost ~]# AA="Hello Linux" [root@localhost ~]# echo $AA Hello Linux 
  • readonly 變量名

在說明一個保留並將它設置為一個特定值后就不再改變它的值時,可以使用readonly命令來保證一個變量的只讀性。

例如:設置變量A為只讀

[root@localhost ~]# A=100 [root@localhost ~]# readonly A [root@localhost ~]# echo $A 100 [root@localhost ~]# A=200 -bash: A: readonly variable 
  • export 變量名

在任何時候創建的變量都只是當前Shell的局部變量,所有不能被Shell運行的其他命令或 Shell程序所利用,而export命令可以將一個局部變量提供給Shell命令使用。

例如:將局部變量B提供給Shell程序使用

[root@localhost ~]# B=100 [root@localhost ~]# export B [root@localhost ~]# echo $B 100 [root@localhost ~]# env|grep B B=100 

也可以在給變量賦值的同時使用export命令

  • export 變量名=變量值

例如:使用export設置的變量在Shell以后運行的所有命令或程序中都可以訪問到。

[root@localhost ~]# export C=100 [root@localhost ~]# echo $C 100 [root@localhost ~]# env|grep C C=100 

3.位置參數變量

當我們執行一個shell腳本時,如果希望獲取到命令行的參數信息,就可以使用到位置參數變量,比如:./myshell.sh 100 200,這個就是一個執行shell的命令行,可以在myshell腳本中獲取到 參數信息。

基本語法 功能描述
$n n為數字,$0代表命令本身,$1-$9代表第一到第九個參數,十以上的參數需要用大括號包含,如$(10)
$* 代表命令行中所有位置的參數,$*把所有參數看作一個整體
$@ 代表命令行中所有位置的參數,$@把每個參數區分對待
$# 代表命令行中所有位置參數的數量

例如:

[root@localhost myshell]# sh ./myshell.sh 100 200 ./myshell.sh,100,200 100 200 100 200 參數的個數=2 
[root@localhost myshell]# ./myshell.sh 1 2 3 4 5 6 7 8 9 10 -bash: ./myshell.sh: Permission denied [root@localhost myshell]# chmod u+x myshell.sh [root@localhost myshell]# ls -l total 4 -rwxr--r--. 1 root root 97 Jul 19 08:50 myshell.sh [root@localhost myshell]# ./myshell.sh 1 2 3 4 5 6 7 8 9 10 ./myshell.sh,1,2 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 參數的個數=10 

4.預定義變量

就是shell設計者事先已經定義好的變量,可以直接在shell腳本中使用,和環境變量類似,所不同的是用戶只能根據shell定義來使用這些變量,所有預定義變量都是由符合“$”和另一個符合組成的。

預定義變量 描述
$$ 當前進程的進程號(PID)
$! 后台運行的最后一個進程號(PID)
$? 最后一次執行命令的返回狀態,0表示沒有錯誤,非0表示有錯誤

5.參數置換的變量

含義:通常是指將含義一個變量表達式的值賦給另一個變量。也是一種為變量賦值的方式。

說明:變量1、變量2用var1、var2表示,字符串用sring表示; var:type=value,“:”表示注解,提示變量的類型。var為要定義的變量,type為該變量期待的類型,value為賦給該變量的值。 本質上和var = value是一回事,只是加上了var的類型說明。 類型注解是一種提示,並非強制的。

格式 var1為空 var2不為空
var2=${var1:-string} var2=string var1不變 var2=$var1 var1不變
var2=${var1:=string} var2=string varvar2=string var1=string var2=$var1 ar1不變
var2=${var1:+string} var2為空 var1不變(也就是說var1也是空) var2=string var1不變
var2=${var1:?string} 輸出格式:hell腳本名:var1=string 並退出shell var2不變 var2=$var1 var1不變

所有這形式中的參數既可以是位置參數,也可以是在另一個變量,只是用位置參數的情況比較多。

變量表達式

  • test是shell程序的一個表達式

語法:test [表達式]

字符串比較
字符串比較符號 描述
= 比較兩個字符串是否相同,相同則為“是”
!= 比較兩個字符串是否相同,不同則為“是”
-n 比較字符串的長度是否大於0,如果大於0則是為“是”
-z 比較字符串的長度是否等於0,如果等於0則為“是”

例如:字符串比較的使用

[root@localhost ~]# str1=abcd [root@localhost ~]# test $str1=abcd [root@localhost ~]# echo $? 0 

結果顯示0表示字符串str1確實等於abcd.

test處理含有空格的變量時最好用引號將變量括起來,否則會出現錯誤的結果。因為Shell在處理命令行時將會去掉多余的空格,而用引號括起來則可以防止shell去掉這些空格。

數字比較

用於測試數字的大小

數字比較符合 描述
-eq 相等
-ge 大於等於
-le 小於等於
-ne 不等於
-gt 大於
-lt 小於

例如:數字相等比較

root@localhost ~]# int1=1234 [root@localhost ~]# int2=01234 [root@localhost ~]# test $int1 -eq int2 -bash: test: int2: integer expression expected [root@localhost ~]# echo $? 2 [root@localhost ~]# test "$int1 -eq int2" [root@localhost ~]# echo $? 0 

從上面可以看出,當test處理有空格變量時,不使用引號將變量括起來會導致錯誤。

例子:數字大於比較

[root@localhost ~]# int1=4 [root@localhost ~]# test “$int1 -gt 2" > echo $? > exit > ^C [root@localhost ~]# test "$int1 -gt 2" [root@localhost ~]# echo $? 0 

從上圖例子可以看出,當引號使用中文格式時會出錯。最后結果0表示字符int1的值確實大於2.

邏輯測試

用於測試文件是否存在

邏輯測試符合 描述
! 與一個邏輯值相反的邏輯值
-a 兩個邏輯值為"是"返回值才為“是”,反之為"否"
-o 兩個邏輯值有一個為“是”返回值就為"是"

例如:邏輯測試

[root@localhost ~]# test -r "empty -a -s empty" [root@localhost ~]# echo $? 1 

結果顯示表示empty存在且只讀以及長度為0

文本操作測試

用於測試文件的文件操作邏輯

文件存在測試符合 描述
-d 對象存在且為目錄則返回值為“是”
-f 對象存在且為文件則返回值為“是”
-L 對象粗壯乃且為符號鏈接則返回值為“是”
-r 對象存在且可讀則返回值為“是”
-s 對象存在且長度非0則返回值為“是”
-w 對象存在且可寫則返回值為“是”
-x 對象存在且可執行則返回值為“是”
! 測試條件的否定

例子:文本操作測試

[root@localhost ~]# cat /dev/null>empty [root@localhost ~]# cat empty [root@localhost ~]# test -r empty [root@localhost ~]# echo $? 0 

結果顯示0表示文件empty存在且只讀

[root@localhost ~]# test ! -s empty [root@localhost ~]# echo $? 0 

結果顯示0表示文件empty存在且文件長度為0

Shell條件判讀語句

  • if
  • case
if條件語句

語法格式:

  • if-then-fi語句

例如:使用if-then-fi語句創建簡單的shell程序( 創建文件名/root/continue,文件名如下)

[root@localhost ~]# vi /root/continue [root@localhost ~]# cat /root/continue #!/bin/bash #filename:continue echo -n "Do you want to continue: Y or N" read ANSWER if [$ANSWER=N -o $ANSWER=n] then exit fi [root@localhost ~]# bash /root/continue Do you want to continue: Y or N 
  • if-then-else-fi語句 例如:使用if-then-else-fi語句創建一個根據輸入的分數判斷分數是否及格的shell程序 文件名為/root/score,如下:
[root@localhost ~]# vi /root/score [root@localhost ~]# cat /root/score #!/bin/bash #filename:score echo -n "please input a score:" read SCORE echo "You input Score is $SCORE" if [$SCORE -ge 60] then echo -n "Congratulation!You Pass the examination." else echo -n "Sorry!You Fall the examination!" fi echo -n "press any key to continue!" read $GOOUT 

運行Shell程序/root/score,輸出內容如下

[root@localhost ~]# bash /root/score please input a score:80 You input Score is 80 /root/score: line 6: [80: command not found Sorry!You Fall the examination!press any key to continue! [root@localhost ~]# ls -l /root/score -rwxr--r--. 1 root root 278 Jul 19 19:26 /root/score [root@localhost ~]# vi /root/score [root@localhost ~]# bash /root/score please input a score:80 You input Score is 80 Congratulation!You Pass the examination.press any key to continue! 

上例中提示第6行"[80: command not found" 運行出錯,經過排查命令運行權限及語句發現。是"["和變量"60"之前缺少空格引起。

case條件語句

為用戶提供根據字符串或變量的值從多個選項中選擇一項的方法。比如,通過計算string的值,將其結果一次與運算式exp-1和exp-2等進行比較,指導找到一個匹配的運算式為止。如果找到匹配項,則執行它下面的命令直到遇到一對分號(;;)為止。在case運算中也可以使用shell通配符(、?、[]).通常用作為case命令的最后運算式,以便在前面找不到任何相應的匹配項時執行"其他命令行"的命令。 例如:使用case語句創建一個菜單選擇的shell腳本。文件名為/root/selection,內容如下:

[root@localhost ~]# vi /root/selection [root@localhost ~]# cat /root/selection #!/bin/bash #filename:selection #Display a menu echo _ echo "1 Restore" echo "2 Backup" echo '3 Unload" echo #Read and excute the user's selection echo -n "Enter Choice:" read CHOICE case "$CHOICE" in 1) echo "Restore";; 2) echo "Backup";; 3) echo "Unload";; *) echo "Sorry $CHOICE is not a valid choice exit 1 esac [root@localhost ~]# bash /root/selection _ 1 Restore 2 Backup 3 Unload" echo #Read and excute the users selection Enter Choice

Shell循環控制語句

  • for
  • while
  • ntil
for循環語句

for循環語句對一個變量的可能的值都執行一個命令序列。賦給變量的幾個數值可以在程序中以數值列表的形式提供,也可以在程序以外以位置參數的形式提供。

變量名可以是用戶選擇的任何字符串,如果變量名是var,則在in之后給出的數字將按順序替換循環命令列表的"$var".如果省略了in,則變量var的取值將是位置參數。對變量的每一個可能的賦值都將執行do和done之間的命令列表。

例如:使用for語句創建簡單shell程序,文件名/root/for,如下

[root@localhost ~]# vi /root/for [root@localhost ~]# cat /root/for #!/bin/bash #filename:for for ab in 1 2 3 4 do echo $ab done 

運行程序/root/for,輸出內容如下:

[root@localhost ~]# bash /root/for 1 2 3 4 

例子:使用for語句創建求命令行上所有整數之和的shell程序,文件名是/root/sum,如下

[root@localhost ~]# vi /root/sum [root@localhost ~]# cat /root/sum #!/bin/bash #filename:sum sum=0 for INT in $* do sum=$(expr $sum + $INT) done echo $sum [root@localhost ~]# bash /root/sum 1 2 3 4 5 15 
while循環語句

while語句是用命令的返回狀態值來控制循環的。只要while的“若干個命令行1”中最后一個命令的返回狀態為真,while循環就繼續執行“若干個命令行2” 例子:使用while語句創建一個計算1~5的平方的shell程序,文件名是/root/zx,如下

[root@localhost ~]# vi /root/zx [root@localhost ~]# cat /root/zx #!/bin/bash #filename:zx int=1 while [ $int -le 5 ] do sq=$(expr $int \* $int) echo $sq int=$(expr $int + 1) done echo "Job Completed" [root@localhost ~]# bash /root/zx 1 4 9 16 25 Job Completed 

例子:使用while語句創建一個工具輸入的數值求累加和(1+2+3+4....+n)的shell程序,文件名/root/number,如下

[root@localhost ~]# vi /root/number [root@localhost ~]# cat /root/number #!/bin/bash #filename:number echo -n "Please Input Number:" read NUM number=0 sum=0 while [ $number -le $NUM ] do echo number echo "$number" number=$(expr $number + 1) echo sum echo "$sum" sum=$(expr $sum + $number) done echo [root@localhost ~]# bash /root/number Please Input Number:4 number 0 sum 0 number 1 sum 1 number 2 sum 3 number 3 sum 6 number 4 sum 10 
until循環語句

它和while類似。是另外一種循環結構,兩者區別在於:while循環語句在條件為真時繼續執行循環,二until循環語句則是在條件為假時繼續執行循環。 例子:使用until語句創建一個輸入exit退出的shell程序,文件名/root/hk,如下

[root@localhost ~]# vi /root/hk [root@localhost ~]# cat /root/hk #!/bin/bash #filename:hk echo "This example is for test until .... do " echo "If you input [exit] then quit the system " echo -n "please input:" read EXIT until [ $EXIT = "exit" ] do read EXIT done echo "OK!" [root@localhost ~]# bash /root/hk This example is for test until .... do If you input [exit] then quit the system please input: 

特別注意:編輯命令時,雙引號是英文狀態下輸入的雙引號,如果中文狀態下輸入的雙引號,會導致命令出錯無法執行。

摘自:《Linux實用教程》人民郵電出版社出版發行 於岳編著


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM