linux學習之shell指令碼 ------- 變數

來源:互聯網
上載者:User

標籤:shell   變數介紹   

[本文是自己學習所做筆記,歡迎轉載,但請註明出處:http://blog.csdn.net/jesson20121020]

今天來看一下Shell中的一些變數。

變數類型:

  Shell中有以下幾種變數:

  1) 本地變數

  2) 環境變數

  3) 位置變數

  4) 標準變數

  5) 特殊變數

  

  1) 本地變數

   本地變數在使用者現在的Shell生命週期的指令碼中使用。

    用法: variable-name=value

   set: 可以顯示本地所有的變數

   注意,本地變數如果加上readonly,則該本地變數不能被修改,也就是說該變數僅僅是可讀的,另外,可以直接輸入readonly或readonly -p列印出所的的本地變數,例如:

[email protected]:~$ TIP="Hello World!"[email protected]:~$ set | grep TIPTIP='Hello World!'[email protected]:~$ echo $TIPHello World![email protected]:~$ echo ${TIP}}Hello World!}[email protected]:~$ TIP="hello world!"[email protected]:~$ echo $TIPhello world![email protected]:~$ readonly TIP[email protected]43SV:~$ TIP="hello shell!"bash: TIP: 唯讀變數[email protected]:~$ readonly declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath"declare -ir BASHPIDdeclare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d"declare -ar BASH_REMATCH='([0]="\${TIP" [1]="\${" [2]="TIP")'declare -ar BASH_VERSINFO='([0]="4" [1]="3" [2]="11" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")'declare -ir EUID="1000"declare -ir PPID="2162"declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"declare -r TIP="hello world!"declare -ir UID="1000"[email protected]:~$ readonly -pdeclare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath"declare -ir BASHPIDdeclare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d"declare -ar BASH_REMATCH='([0]="\${TIP" [1]="\${" [2]="TIP")'declare -ar BASH_VERSINFO='([0]="4" [1]="3" [2]="11" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")'declare -ir EUID="1000"declare -ir PPID="2162"declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"declare -r TIP="hello world!"declare -ir UID="1000"

  2) 環境變數

   環境變數用於所有的使用者進程(通常稱為子進程),登入進程稱為父進程。Shell中執行的使用者進程均稱為子進程。本地變數僅用於本機使用者的進程,而環境變數則可用於所有的子進程,包括編輯器,指令碼和應用。

   “export 變數” 可以將該變數設定為環境變數,另外,可以直接輸入export命令或env命令,就可以查看所有的環境變數,如:

[email protected]:~$ export NAME="jesson20121020"[email protected]:~$ env | grep NAMENAME=jesson20121020

 

  3) 位置變數

   在Shell中位置有變數有9個,即$1,...,$9,超過9個就要用其他的方式實現,參考以下指令碼:

parm.sh

#!/bin/bash#parmecho "指令碼的名稱:" $0echo "指令碼的第一個參數:" $1echo "指令碼的第二個參數:" $2echo "指令碼的第三個參數:" $3echo "指令碼的第四個參數:" $4echo "指令碼的第五個參數:" $5echo "指令碼的第六個參數:" $6echo "指令碼的第七個參數:" $7echo "指令碼的第八個參數:" $8echo "指令碼的第九個參數:" $9
   運行以上指令碼得到:

[email protected]:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G指令碼的名稱: ./parm指令碼的第一個參數: A指令碼的第二個參數: B指令碼的第三個參數: C指令碼的第四個參數: D指令碼的第五個參數: E指令碼的第六個參數: F指令碼的第七個參數: G指令碼的第八個參數:指令碼的第九個參數:

   再看一個指令碼,實現按檔案名稱尋找目前的目錄下的檔案

searchfile.sh   

#!/bin/bash#searchfilefind . -name $1 -print
   如果我們要尋找目前的目錄下的parm.sh這個檔案,就可以這樣做:
[email protected]:~/develop/workspace/shell_workspace$ ./searchfile.sh parm.sh./parm.sh
   可以看到,尋找到了,並列印出來了。

  4) 標準變數

   bash預設建立了一些標準的環境變數,可以在/etc/profile中定義,主要有EXINIT,HOME(家目錄),IFS(預設分隔符號),LOGNAME,MAIL,MAILCHECK(預設為60),MAILPATH,PATH,PSI,PS2(用於一行運行多個命令時),SHELL,TERM(終端),TZ(時區),PWD(目前的目錄),MANPATH(協助文檔存放目錄),TERMINFO,EDITOR等。

  5) 特殊變數

    $#: 傳遞到指令碼的參數個數

    $*: 以一個單字串顯示所有向指令碼傳遞的參數,與位置變數不同,此選項參數可以超過9個。

    $$: 指令碼啟動並執行當前進程ID號。

    $!: 後台啟動並執行最後一個進程的進程ID號。

    [email protected]: 與$#相同,但是使用時加引號,並在引號中返回每個參數。

    $-: 顯示shell使用的當前選項,與set命令功能相同。

    $?: 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。 

   我們修改上述的parm.sh指令碼如下:

parm.sh

#!/bin/bash#parmecho "指令碼的名稱:" $0echo "指令碼的第一個參數:" $1echo "指令碼的第二個參數:" $2echo "指令碼的第三個參數:" $3echo "指令碼的第四個參數:" $4echo "指令碼的第五個參數:" $5echo "指令碼的第六個參數:" $6echo "指令碼的第七個參數:" $7echo "指令碼的第八個參數:" $8echo "指令碼的第九個參數:" $9echo "顯示參數個數:" $#echo "顯示指令碼全部參數:" $*echo "顯示當前指令碼的進程ID號:" $$echo "顯示前一命令啟動並執行狀態:" $?
  運行一下,結果如下:

[email protected]:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G指令碼的名稱: ./parm.sh指令碼的第一個參數: A指令碼的第二個參數: B指令碼的第三個參數: C指令碼的第四個參數: D指令碼的第五個參數: E指令碼的第六個參數: F指令碼的第七個參數: G指令碼的第八個參數:指令碼的第九個參數:顯示參數個數: 7顯示指令碼全部參數: A B C D E F G顯示當前指令碼的進程ID號: 30089顯示前一命令啟動並執行狀態: 0
   shell中的變數基本就這5種,下面我們再看一些與變數相關的命令吧。

與變數相關的命令:  變數替換

   變數替換即用變數的值替換它的名子。

   在變數名前加$,使用echo $變數名 就可以列印出該變數的值。

   變數替換有以下幾種方式:

變數替換方式

說明

$variable-name

引用實際值到variable-name

${variable-name}

同上

${variable-name:+value}

如果設定了variable-name,則顯示其值,否則,為空白

${variable-name:?value}

如果未設定variable-name,則顯示使用者自訂的錯誤資訊。

${variable-name:-value}

如果未設定variable-name,則顯示其值

${variable-name:=value}

如果未設定variable-name,則設定其值並顯示

   以下例子示範了這幾個變數替換使用方法和效果

[email protected]:~$ var="hello world!"[email protected]:~$ echo $varhello world![email protected]:~$ echo ${var}hello world![email protected]:~$ echo ${var:+"hello shell!"}hello shell![email protected]:~$ echo ${var1:+"hello shell!"}[email protected]:~$ echo ${var:?"define"}hello world![email protected]:~$ echo ${var:-"hello shell!"}hello world![email protected]:~$ echo ${var1:-"hello shell!"}hello shell![email protected]:~$ echo $var1[email protected]:~$ echo ${var:="hello shell!"}hello world![email protected]:~$ echo ${var1:="hello shell!"}hello shell![email protected]:~$ echo $var1hello shell!
   既然有變數替換,那麼相應的肯定有變數清除了。  變數清除

   可以清除已設定的變數。

     用法: unset variable-name

[email protected]:~$ echo $var1hello shell![email protected]:~$ unset var1[email protected]:~$ echo $var1 
    影響變數的命令

   declare

    設定或顯示變數

    -f: 只顯示函數名

    -r: 建立唯讀變數(declare和typeset)

    -x: 建立轉出變數

    -i: 建立整數變數

    使用+替代-,可以顛倒選項的含義

   export

    用於建立傳給子shell的變數

    --: 表明選項結束,所有後續參數都是實參。

    -f: 表明在"名-值"對中名字是函數名

    -n: 把全域變數轉換成局部變數。換名話說,命令的變數不再傳遞給shell。

    -p: 顯示全域變數列表

   readonly

    用於顯示或設定唯讀變數

    --: 表明選項結束

    -f: 建立唯讀變數

   set

    設定或重設各種shell

   shift [n]

    用於移動位置變數,調整位置變數。

   typeset

    用於顯示或設定變數

    是declare的同義字

   unset

    用於取消變數的定義

    -- 表明選項結束

    -f: 刪除唯讀變數,但不能取消從Shell環境中刪除指定的變數和函數,如PATH,PSI,PS2,PPID,UID,EUDI等。

   其實,這些變數大多數已使用過,我們重點看一下shift的用法及意義,如下:

parm.sh

#!/bin/bash#parmecho "指令碼的名稱:" $0echo "指令碼的第一個參數:" $1echo "指令碼的第二個參數:" $2echo "指令碼的第三個參數:" $3echo "指令碼的第四個參數:" $4echo "指令碼的第五個參數:" $5echo "指令碼的第六個參數:" $6echo "指令碼的第七個參數:" $7echo "指令碼的第八個參數:" $8echo "指令碼的第九個參數:" $9echo "顯示參數個數:" $#echo "顯示指令碼全部參數:" $*echo "顯示當前指令碼的進程ID號:" $$echo "顯示前一命令啟動並執行狀態:" $?shiftecho "指令碼的第一個參數:" $1echo "指令碼的第二個參數:" $2
   運行結果:

[email protected]:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G指令碼的名稱: ./parm.sh指令碼的第一個參數: A指令碼的第二個參數: B指令碼的第三個參數: C指令碼的第四個參數: D指令碼的第五個參數: E指令碼的第六個參數: F指令碼的第七個參數: G指令碼的第八個參數:指令碼的第九個參數:顯示參數個數: 7顯示指令碼全部參數: A B C D E F G顯示當前指令碼的進程ID號: 31218顯示前一命令啟動並執行狀態: 0指令碼的第一個參數: B指令碼的第二個參數: C
   接著,我們再改動一下,在shift 後加上2,如下:

parm.sh

#!/bin/bash#parmecho "指令碼的名稱:" $0echo "指令碼的第一個參數:" $1echo "指令碼的第二個參數:" $2echo "指令碼的第三個參數:" $3echo "指令碼的第四個參數:" $4echo "指令碼的第五個參數:" $5echo "指令碼的第六個參數:" $6echo "指令碼的第七個參數:" $7echo "指令碼的第八個參數:" $8echo "指令碼的第九個參數:" $9echo "顯示參數個數:" $#echo "顯示指令碼全部參數:" $*echo "顯示當前指令碼的進程ID號:" $$echo "顯示前一命令啟動並執行狀態:" $?shift 2echo "指令碼的第一個參數:" $1echo "指令碼的第二個參數:" $2
   運行結果如下:
[email protected]:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G指令碼的名稱: ./parm.sh指令碼的第一個參數: A指令碼的第二個參數: B指令碼的第三個參數: C指令碼的第四個參數: D指令碼的第五個參數: E指令碼的第六個參數: F指令碼的第七個參數: G指令碼的第八個參數:指令碼的第九個參數:顯示參數個數: 7顯示指令碼全部參數: A B C D E F G顯示當前指令碼的進程ID號: 31366顯示前一命令啟動並執行狀態: 0指令碼的第一個參數: C指令碼的第二個參數: D

linux學習之shell指令碼 ------- 變數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.