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 21:43
下一篇 2018-04-14 11:26

相關推薦

  • Linux系統上命令的使用格式

    命令的語法通用格式: ~]# COMMAND OPTIONS ARGUMENTS ifconfig命令格式 ifconfig [interface] [options] | address   Echo命令格式 echo [options] …[string]… tty命令格式 tty [options] startx命令格…

    Linux筆記 2018-05-13
  • 基于Memcached的session server

    session server:將Tomcat的session信息保存在Memcached中,實現session server 前提: 兩個Tomcat節點,兩個Memcached節點,一個nginx節點;Tomcat需要使用到Memcached-session-manager這個Java類,即上面所說的調用了Memcached提供的API的模塊,以達到Mem…

    Linux筆記 2018-03-31
  • 喜歡上find

    喜歡上findfind :查找目錄下的文件。find 命令其實很好記,會用了,那簡直太好玩太方便了-newer查找更改時間比指定文件新的文件-type 按類型查找 (d f l s b c p )D-name 按文件名查找-mtime 按修改時間查找( +2 -2 2)-size 按文件大小查找-perm 按文件權限查找-user 按文件屬主來查找-nous…

    2018-04-18
  • Mysql之備份及還原相關實驗

    本節索引 實驗一:冷備份數據庫并還原 實驗二:結合LVM邏輯卷實現幾乎熱備 實驗三:數據庫數據文件損壞后,利用mysqldump還原至最新狀態 實驗四:誤刪除表后,利用mysqldump還原至最新狀態 實驗五:Xtrabackup完全備份及還原 實驗六:Xtrabackup完全,增量備份及還原 實驗七:Xtrabackup單表導出和導入   實驗準…

    2018-06-14
  • 腳本練習

    腳本編程

    2018-04-15

評論列表(1條)

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

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

欧美性久久久久