常用的shell腳本tips

 

1、  set 命令

當沒有參數的時候,列出系統中所有的自定義變量值;當有參數的時候,重置基本參數如 $1 $2 等。如 set `date` date 命令的輸出當作輸入參數;


2 let 命令

      執行算術運算。功能如 i=j+1,shell 語法爲:

      l et “i=$j+1” ,等同於 ‘expr’。 後者只能作用於整數,如  i=`expr $i+1`; 如果使用非整數,退出狀態不爲 0


3、expr    

      expr 也有模式匹配功能。

   可以使用 expr 通過指定 冒號選項計算字符串中字符數。 .* 意即任 何字符重複 0 次或多次。
        $value=accounts.doc
        $expr $value : '.*'
   輸出: 12
   在 expr 中可以使用字符串匹配操作,這裏使用模式 . d o c 抽取文件附屬名。
       $expr $value : '/(.*/).doc'
在圓括號前加轉義符號是表示圓括號是用於提取功能的。
   輸出: accounts


4、shift命令

       將參數表向左移動一個位置, $2 變成 $1,... ,依次類推。

 

5、shell中可以嵌套命令,使用/`來保護內層命令,如`cd /`pwd/``。

 

6、設置 IFS 爲換行符: IFS=’

(還真得換行)

 

7、兩個特殊操作

     命令 1 && 命令 2 :只有在命令 1 執行成功時才執行命令 2

     命令 1 || 命令 2 :命令 1 失敗才執行命令 2

 

8、變量賦值

     “”引用的字符串需要shell解析其中的 `` $ / 等特殊字符,而 ’’ 引用的字 符串則被看作完全的

   字符串, echo ‘`pwd`’ 將輸出 `pwd` ;而 echo “`pwd`” 將輸出當前目錄 ;

  

變量

含義

$var

Var 的值,若無定義則無值

${var}

同上,用於同 $varx 等類型變量區分

${var-thing}

Var 有定義時,取值 $var ;無定義時取值 thing ,而 $var 不變

${var=thing}

Var 有定義時,取值 $var ;無定義時取值 thing $var 值設爲 thing

${var?message}

有定義時取值 $var ;否則打印 message 並退出 shell ,若 message 爲空串,打印 var:parameter not set

${var+thing}

有定義時取值 thing ;否則無值

 

9、shell內部變量


環境變量
   當啓動一個Shell腳本時,一些變量會由環境中的值進行初始化.在腳本中這些變量通常爲大寫字母,從而與用戶定義的變量進行區分,而用戶定義的變理常用小寫字母來表示.創建的變量依賴於我們個人的配置.其中的許多列在手冊頁中,但是基本的一些列在下面的表中:
$HOME    當前用戶的主目錄
$PATH    用來進行命令查找的由冒號分隔的目錄列表
$PS1    命令提示,通常爲$,但是在bash中我們可以使用更爲複雜的值.例如,字符串[/u@/h /W]$是流行的默認用法來告訴我們當前的用戶,機器名稱以及當前的工作目錄,同時給出$提示.
$PS2    第二提示符,當提示額外的輸入時使用,通常爲>
$IFS    輸入區域分隔符.當Shell讀入輸入時會使用一個字符列表來分隔輸入的單詞,通常是空格,tab和新行字符.
$0    Shell腳本的名稱.
$#    傳遞的參數個數.
$$    腳本的進程ID,通常用在一個腳本內部用來建立唯一的一個臨時文件,如/tmp/tmp-file_$$.
如果我們的腳本調用一些參數,那麼會建立一些其他的變量.即使沒有傳遞參數,環境變量$#仍然存在,但是值卻爲0.
參數變量列在下面這個表中:
$1,$2,...    傳遞給腳本的參數.
$*    以單變量的形式顯示所有的參數列表,由環境變量IFS中的第一個字符分隔.
$@    $*的一個靈巧變形.他並不使用IFS環境變量,所以如果IFS爲空那麼所有的所有的參數會一起運行.

     

變量

含義

$#

參數個數

$*

所有參數

$@

同上,稍有區別

$-

Shell 的選擇項

$?

上次執行命令返回值

$$

Shell 的進程標識符

$!

& 啓動的最後一個命令的進程標識符

$HOME

cd 命令的缺省參數

$IFS

參數分割詞的字符表

$MAIL

信件文件,當其改變時給出信息 you have mail

$PATH

搜索命令的目錄表

$PS1

提示符串,缺省爲 $

$PS2

後繼命令行提示符,缺省爲 >

有關 $* $@ 得歸納:

  $* $@ 擴展爲參數,並被重複掃描;參數得空格將字符串分成多個參數;

  “$*” 表示 shell 文件的所有參數及其空格連在一起作爲單個詞處理;

$@ ”與 shell 文件接收的參數等價,參數中的空格被忽略,其結果是等同於原來參數 的一個單詞列表。

 

10、 shell 模式匹配規則

*      匹配任意字符串,包括空字符串

?      匹配任意單字符串

[ABC]  匹配 ABC 中任意字符

“…”   完全與 匹配,引號保護特殊字符,也可以寫成 ’…’

/C     匹配 C

 

11、 case 語句

case word in

  模式 1)  命令 ;;

  模式 2)  命令 ;;

  …

  *)       命令 [;;]

esac

只能匹配一個模式

 

12、 if 語句

if 命令

then

else

fi

其中換行很重要, then else fi 僅在換行或分號之後被識別, else 部分可選。可以利用case語句替代if和test測試語句,對於test命令不是內部命令的情況下,case語句執行的要快;

 

13、循環

1)for i [in 文件(參數)列表 ]

do

  循環體

done

        如果 i 後面沒有 in 部分,則隱含地表示對 shell 文件的全部參數,即 $*

 

      2) While 命令

            do

                  循環體,只要命令返回狀態爲真便繼續進行

  done

 

3) until 命令

do

   循環體,只要命令返回狀態爲假便繼續執行

Done

 

例如:

While sleep 60

do

Done

每隔 60 秒執行一次循環中的操作;

 

   另外 , where 處的控制命令可以是 true false 、或者是 : ,冒號 命令是一個 shell 內部命令,僅 僅計

   算參數值,然後返回“真”,但是它不需要調用系統中的命令,所以效率比 true 命令高 ;

 

  4)break 命令:退出循環,取自 C 語言。

 

14、點號命令:

   將文件作爲標準輸入,從中讀入一行一行的命令在當前 shell 中執行,不要求文件具有可執行權限 ;

 

15、 文件命令習慣,後面加上當前進程號碼 $$ 爲好

 

16、標準輸入命令read

$read greeting

Hello,world

            $echo $greeting

                 Hello,world

 

17、here document 輸入

         <<s   從本地輸入,直至出現字符串 s 爲止,但是要解析輸入中的特殊字符, `` $ /

      <<’s’ 同上, 不進行替換。

    <</s 同上。



如果談到I/O重定向,就涉及到文件標識符(File Descriptor)的概念, 在Linux系統中,系統爲每一個打開的文件指定一個文件標識符以便系統對文件進行跟蹤,這裏有些和C語言編程裏的文件句柄相似,文件標識符是一個數字, 不同數字代表不同的含義,默認情況下,系統佔用了3個,分別是0標準輸入(stdin),1標準輸出(stdout), 2標準錯誤(stderr), 另外3-9是保留的標識符,可以把這些標識符指定成標準輸入,輸出或者錯誤作爲臨時連接。通常這樣可以解決很多複雜的重定向請求。

 

以下命令是把標準輸出和錯誤都定向到文件

#ls /dev &>filename


"&"在這裏代表標準輸出和標準錯誤,這裏無論是正常輸出還是錯誤信息都寫到filename中了。

重新定義標準輸入,輸出,和錯誤的文件標識符

重新定義文件標識符可以用i>&j命令,表示把文件標識符i重新定向到j,你可以把"&"理解爲"取地址"

請看以下例子

#exec 5>&1


表示把文件標識符5定向到標準輸出,這個命令通常用來臨時保存標準輸入。

 i>&j
 # 重定向文件描述符ij

 # 指向i
文件的所有輸出都發送到j


. 

命令j<>filename表示把文件打開,並指明文件標識符爲j
"&-"表示關閉文件標識符


參考:http://blog.chinaunix.net/u1/34739/showart_283263.html



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章