shell腳本編程基礎(2)——新手注意事項及技巧16條

總結了一些shell腳本編程初學者常犯的錯誤、注意事項及技巧

timg_image&quality=80&size=b9999_10000&sec=1523686172840&di=7220089bb2b98e859a79

總結了一些shell編程初學者常犯的錯誤、注意事項及技巧:

1.判斷變量是否加$:

(1)賦值變量時不加$

(2)如果命令能識別變量就不加$,如果命令不能識別變量加$

 

2.存放多行字符時”$name”變量外加雙引號可保留換行格式

保留格式

 

3.{}和()中執行命令的區別:

()中使用的命令為一次性的,小括號中相當于在子進程中執行命令,小括號繼承括號外變量,但不會影響括號外變量

注:小括號中所說的子進程與常規的子進程不是一回事

而{ }中使用命令是在當前shell環境中執行,不會不開啟子進程,會影響當前shell環境

例1:x=1;echo $$;(echo $$;echo $x;x=2);echo $x

小括號

雖然括號內開啟了一個子進程,但該子進程號和括號外進程號一致;此外括號外變量會影響括號內,但括號內變量更改不會影響括號外。

例2:(echo $$;exit)

小括號退出

執行此命令,顯示當前所在進程號,exit退出()內子進程

{ }中使用命令是在當前shell環境中執行,不會不開啟子進程,會影響當前shell環境

例3:x=1;echo $$;{ echo $$;echo $x;x=2; };echo $x

花括號

{}內命令相當于當前shell執行,因此括號外和括號內進程號一致,此外{}內變量影響了{}外的變量。

例4:{ ?echo$$;exit; ?}

花括號退出

執行此命令,顯示當前所在進程號,exit退出當前shell;

因此編寫腳本時,想要使用括號利用exit命令退出腳本,一定要使用{},而不能使用()

 

4.短路與&&和短路或||嵌套連續命令時可使用大括號

如&&{ ?cmd1 ;cmd2 ; };||{ ?cmd1 ;cmd2 ;};

 

測試或命令結果為假時,后跟連續多條命令,必須需采用此種格式:

false || { echo cmd1 ; echo cmd2 ; }

表示測試或命令返回false時,執行cmd1,cmd2

 

測試或命令結果為真時,后跟連續多條命令,可寫為:

true && echo cmd1 && echo cmd2

也可寫為:

true && { echo cmd1 ; echo cmd2 ; }

 

當條件測試或命令后同時出現短路且&&與短路或||有嵌套命令的情況時:

如:[ Test ] && { echo cmd1 ; echo cmd2 ; } || { echo cmd3; echo cmd4 ; }

表示當Test為真時,執行命令cmd1,cmd2;當Test為假時,執行cmd3,cmd4;

 

5.引用超過10個以上的位置變量時,數字加{};如$10要寫為${10}

不加{}時,默認將$10當作$1和0表示出來:

大于10個參數1

大于10個參數2

當給10加上大括號后,${10}才表示第10個位置變量:

大于10個參數3

大于10個參數4

 

6.位置變量$*與$@的區別

兩者都可表示傳遞給腳本的所有參數,但$*將每個參數合并為一個字符串;

$星

而$@每個參數作為獨立字符

$圈

注意:$@、$*只在被雙引號包起來的時候才會有差異。

 

7.在使用[? ]和test引用變量時,最好加雙引號””避免出問

不加引號也許不會出錯,但加上引號肯定不會有錯

 

8.腳本中進行變量的算術運算時,有空格盡量刪除

變量的算術運算,多一個空格就會導致出錯,所以盡量將空格刪除

數學運算

 

9.進行條件測試過程中,能加空格地方盡量都加空格

條件測試時,無論是括號兩端還是字符兩端少一個空格就會導致出錯,所有盡量都加空格

條件測試空格

10.使用=~進行PATTERN匹配時,需要加雙括號[[ ]],且正則表達式不能加引號,默認使用擴展正則表達式

正則表達式加引號就會導致錯誤結果,這與我們在使用grep與sed等命令利用到正則表達式需要加引號正好相反,需要注意

正則表達式

 

11.用于字符串比較時的用到的操作應該都使用引號

同上,不加引號也許不會出錯,但加上引號肯定不會有錯

 

12.[[? == ]]右側可匹配類似于通配符glob的用法

此種匹配類似于通配符,但不完全等同于通配符,注意格式雙中括號,雙等號 [[ == ]]

類似通配符

13.腳本里不支持別名

 

14.文件測試后跟空字符時,也反饋為True。

例如:/data/fstab為普通文件,用-f選項判斷時,后跟fstab文件或者空時都判斷為真

文件條件判斷

因此要保證一個文件存在且滿足測試條件時,

可表示為:[ -n ?“file” ?-a ?–f ?“file” ]

file文件是否存在且為普通文件

 

15.測試字符串是否為空除了-z及-n選項,還可用[ ?“$var” ?= ?“” ?];[ ?x”$var” ?= ?“x” ?]來測試。

例1:當$var為空時,使用[ ?“$var” ?= ?“” ?]返回結果0

測試為空1

例2:當$var為空時,[ ?x”$var” ?= ?“x” ?]返回結果為0

測試為空2

 

16.養成好習慣:變量一使用完后就用unset刪掉。

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95882

(6)
wangxczwangxcz
上一篇 2018-04-13
下一篇 2018-04-14

相關推薦

  • 第六周作業

    1、簡述osi七層模型和TCP/IP五層模型 1、 osi七層模型 1、應用層:OSI 參考模型中最靠近用戶的一層,為計算機用戶提供應用接口,也為用戶直接提供各種網絡服務。我們常見應用層的網絡服務協議有:HTTP,HTTPS,FTP,POP3、SMTP等。 2、表示層:提供各種用于應用層數據的編碼和轉換功能,確保一個主機的應用層發送的數據能被另一個主機的應用…

    2018-06-29
  • N31第三周

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 who | cut -d ‘ ‘ -f1 | sort -u 2、取出最后登錄到當前系統的用戶的相關信息。 ?w |cut -d ‘ ‘ -f1 |tail -1 |xargs id 3、取出當前系統上被用戶當作其默認shell的最多的那個shell。 cat /et…

    Linux筆記 2018-07-16
  • cobbler自動化安裝

    實驗:實現cobbler安裝 1 安裝包 yum install cobbler(EPEL) dhcp httpd tftp systemctl enable cobblerd dhcpd httpd tftp systemctl start cobblerd httpd tftp 2 cobbler check 3 vim /etc/cobbler/set…

    Linux筆記 2018-05-27
  • DNS服務

    DNS主從服務器,子域實現,反向解析,DNS服務架構

    2018-06-02
  • Nginx介紹及Web服務相關配置

    Nginx 是一個高性能的Web和反向代理服務器, 它具有有很多非常優越的特性:作為 Web 服務器:相比Apache,Nginx 使用更少的資源,支持更多的并發連接,體現更高的效率,這點使 Nginx尤其受到虛擬主機提供商的歡迎。

    2018-07-10

評論列表(1條)

  • M30-Alvin阿峰
    M30-Alvin阿峰 2018-04-14 11:54

    封面很花哨,(手動滑稽 :p

欧美性久久久久