歡迎您光臨本站 註冊首頁

SHELL中的變數

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

一,本地變數:

本地變數就如同局部變數一樣,只在本SHELL中起作用。它不會影響到其他SHELL中的變數。

格式:NAME=value

1,變數的調用:在變數前加$
$ echo $HOME
/home/hbwork
$ WEEK=Satur
$ echo Today is $WEEKday
Today is
$echo Today is ${WEEK}day //若變數和其他字元組成新的字,這時就必須給變數加上大括弧{},以更加清楚的顯示給shell,哪個是真正的變數,以實現字元串的合併等功能。
Today is Saturday

2,顯示變數值
可以使用echo命令。需要注意的是,使用變數的時候必須在變數名前加上$符號。另外可以使用set命令,顯示所有本地SHELL變數。包括SHELL中預定義了一些環境變數,且用戶自己已經定義過的本地變數也會在其中顯示。

3,Shell變數賦值從右到左進進行賦值(變數未賦值時,shell不報錯,而是賦值為空!)
$ X=$Y Y=y
$ echo $X
y
$ Z=z Y=$Z
$ echo $Y

$

4,使用unset命令刪除變數的賦值
$ Z=hello
$ echo $Z
hello
$ unset Z
$ echo $Z

$

5,有條件的命令替換 (測試變數是否已經賦值)
在Bourne Shell中可以使變數替換在特定條件下執行,即有條件的環境變數替換。 這種變數替換總是用大括弧括起來的。

${variable: -value}變數替換時將使用命令行中定義的默認值,但變數的值並沒有因此而改變。variable是一變數值,value是變數替換使用的默認值

例:$echo Hello $UNAME
結果顯示:Hello
$echo Hello ${UNAME: -there}
結果顯示:Hello there
$echo $UNAME
結果顯示: (空)
$UNAME=John
$echo Hello ${UNAME: -there}
結果顯示:Hello John

${variable:=value}不但使用默認值進行替換,而且將默認值賦給該變數。該形式在變數替換后同時把值value符給變數variable。

例:$echo Hello $UNAME
結果顯示:Hello
$echo Hello ${UNAME:=there}
結果顯示:Hello there
$echo $UNAME
結果顯示:there

變數替換的值也可以是` `括起來的命令:

$USERDIR={$Mydir: -`pwd`}

${variable: +value}只有當變數已賦值時才用指定值替換,變數variable已賦值時,其值才用value替換,否則不進行任何替換。

例:$ERROPT=A
$echo ${ERROPT: +"Error tracking is acitive"}
結果顯示:Error tracking is acitive
$ERROPT=
$echo ${ERROPT: +"Error tracking is acitive"}
結果顯示: (空)

${variable:?message}使用錯誤檢查的條件進行變數替換,當變數variable已設置時,正常替換。否則消息message將送到標準錯誤輸出(若此替換出現在shell程序中,那麼該程序將終止)。

例:$UNAME=
$echo $ {UNAME:?"UNAME HAS NOT BEEN SET"}
結果顯示:UNAME HAS NOT BEEN SET

$UNAME=Stephanie
$echo $ {UNAME:?"UNAME HAS NOT BEEN SET"}

結果顯示:Stephanie
當沒有指定message時,shell將顯示一條默認的消息,例如:

$UNAME=
$echo $ {UNAME:?}
結果顯示:sh:UNAME:parameter null or not set

6,特殊設置

readonly 變數名

有時我們想要在說明一個變數並對它設置為一個特定值后就不在改變它的值時,可以用下面的命令來保證一個變數的只讀性:單獨執行readonly可以顯示所有的只讀變數。

export 變數名

在任何時候,創建的變數都只是當前Shell的局部變數,所以不能被Shell運行的其他命令或Shell程序所利用,而export命令可以將一個局部變數提供給Shell執行的其他命令使用,也可以在給變數賦值的同時使用export命令(export 變數名=變數值)。使用export說明的變數,在Shell以後運行的所有命令或程序中都可以訪問到。

二,Shell參數

1、 位置參數

  由系統提供的參數稱為位置參數。位置參數的值可以用$N得到,N是一個數字,如果為1,即$1.類似C語言中的數組,在shell解釋用戶的命令時,將把命令行的第一個字作為命令,而其他的字作為參數。當命令對應的可執行文件為Shell程序時,這些參數將作為位置變數傳送給該程序。第0號為程序名字,從1開始就表示傳遞給程序的參數。第一個參數記為$1,第二個為$2....第九個為$9。其中1到9是真正的參數名,"$"符只是用來標識變數的替換。

2、 內部參數

  上述過程中的$0是一個內部變數,它是必須的,代表程序本身,而$1則可有可無。和$0一樣的內部變數還有以下幾個。

$# ----傳遞給程序的總的參數數目
  $? ----上一個代碼或者shell程序在shell中退出的情況,如果正常退出則返回0,反之為非0值。
  $* ----傳遞給程序的所有參數組成的字元串。
$- ----在Shell啟動或使用set命令時提供選項
$? ----上一條命令執行后返回的值
$$ ----當前shell的進程號
$! ----上一個子進程的進程號
$@ ----所有的參數,每個都用雙括弧括起
$n ----位置參數值,n表示位置
$0 ----當前shell名



  例:建立一個內容為如下的程序P1:

  echo 「Program name is $0」
  echo 「There are totally $# parameters passed to this program」
  echo 「The last is $?」
  echo 「The parameters are $*」

  執行后的結果如下:

  [beichen@localhost bin]$ P1 this is a test program //傳遞5個參數

  Program name is /home/beichen/bin/P1 //給出程序的完整路徑和名字

  There are totally 5 parameters passed to this program //參數的總數

  The last is 0 //程序執行結果

The parameters are this is a test program //返回有參數組成的字元串0

三,環境變數:

shell 環境變數是所有shell 程序都會接受的參數。shell程序運行時,都會接收一組變數,這組變數就是環境變數,它作用於所有的用戶進程。在Linux中,登陸進程稱為父進程,shell中執行的用戶程序均稱為子進程。

環境變數可以在命令行中設置,但用戶註銷時這些值將丟失。因此最好在$HOME/目錄下的.profile中定義。傳統上環境變數均為大寫。環境變數應用於用戶進程之前,必須用export命令導出。設置方法與本地變數設置方法相同。

1,顯示環境變數

使用env命令或者 printenv 命令可以察看所有環境變數

2,將變數導出到子進程

在父腳本中使用export命令可以將變數導出,這樣子腳本便可以知道該變數的值。

如果你希望把你定義的變數讓其他所有的shell程序都能使用,也就是定義新的環境變數,你只要使用export關鍵詞就可以了。

  3,常用的Shell環境變數有:

  HOME 用於保存註冊目錄的完全路徑名。

  PATH 用於保存用冒號分隔的目錄路徑名,Shell將按PATH變數中給出的順序搜索這些目錄,找到的第一個與命令名稱一致的可執行文件將被執行。

  TERM 終端的類型。

  UID 當前用戶的識別字,取值是由數位構成的字串。

  PWD 當前工作目錄的絕對路徑名,該變數的取值隨cd命令的使用而變化。

PS1 主提示符,在特權用戶下,默認的主提示符是#,在普通用戶下,默認的主提示符是$。

附:

bash的內部命令

  bash命令解釋套裝程序包含了一些內部命令。內部命令在目錄列表時是看不見的,它們由Shell本身提供。常用的內部命令有:echo, eval, exec, export, readonly, read, shift, wait和點(.)。下面簡單介紹其命令格式和功能。

  1.echo

  命令格式:echo arg

  功能:在屏幕上顯示出由arg指定的字串。

  2.eval

  命令格式:eval args

  功能:當Shell程序執行到eval語句時,Shell讀入參數args,並將它們組合成一個新的命令,然後執行。

  3.exec

  命令格式:exec命令參數

  功能:當Shell執行到exec語句時,不會去創建新的子進程,而是轉去執行指定的命令,當指定的命令執行完時,該進程(也就是最初的Shell)就終止了,所以Shell程序中exec後面的語句將不再被執行。

  4.export

  命令格式:export變數名或:export變數名=變數值

  功能:Shell可以用export把它的變數向下帶入子Shell,從而讓子進程繼承父進程中的環境變數。但子Shell不能用export把它的變數向上帶入父Shell。

  注意:不帶任何變數名的export語句將顯示出當前所有的export變數。

  5.readonly

  命令格式:readonly變數名

  功能:將一個用戶定義的Shell變數標識為不可變。不帶任何參數的readonly命令將顯示出所有隻讀的Shell變數。

  6.read

  命令格式:read變數名表

  功能:從標準輸入設備讀入一行,分解成若干字,賦值給Shell程序內部定義的變數。

  7.shift語句

  功能:shift語句按如下方式重新命名所有的位置參數變數,即$2成為$1,$3成為$2…在程序中每使用一次shift語句,都使所有的位置參數依次向左移動一個位置,並使位置參數$#減1,直到減到0為止。

  8.wait

  功能:使Shell等待在後台啟動的所有子進程結束。wait的返回值總是真。

  9.exit

  功能:退出Shell程序。在exit之後可有選擇地指定一個數位作為返回狀態。

  10.「.」(點)

  命令格式:. Shell程序文件名

  功能:使Shell讀入指定的Shell程序文件並依次執行文件中的所有語句。

運行Shell程序的方法

  用戶可以用任何編輯程序來編寫Shell程序。因為Shell程序是解釋執行的,所以不需要編譯成目的程序。按照Shell編程的慣例,以bash為例,程序的第一行一般為「#!/bin/bash」,其中 # 表示該行是註釋,嘆號!告訴Shell運行嘆號之後的命令並用文檔的其餘部分作為輸入,也就是運行/bin/bash並讓/bin/bash去執行Shell程序的內容。

  執行Shell程序的方法有3種。

  1.bash Shell程序文件名  

  這實際上是調用一個新的bash命令解釋程序,而把Shell程序文件名作為參數傳遞給它。新啟動的Shell將去讀指定的文件,可執行文件中列出的命令,當所有的命令都執行完后結束。該方法的優點是可以利用Shell調試功能。

  2. bash< Shell程序名

  這種方式就是利用輸入重定向,使Shell命令解釋程序的輸入取自指定的程序文件。

  3.用chmod命令使Shell程序成為可執行的

  一個文件能否運行取決於該文檔的內容本身可執行且該文件具有執行權。對於Shell程序,當用編輯器生成一個文件時,系統賦予的許可權都是644(rw-r-r--),因此,當用戶需要運行這個文件時,只需要直接鍵入文件名即可。

  在這3種運行Shell程序的方法中,最好按下面的方式選擇:當剛創建一個Shell程序,對它的正確性還沒有把握時,應當使用第一種方式進行調試。當一個Shell程序已經調試好時,應使用第三種方式把它固定下來,以後只要鍵入相應的文件名即可,並可被另一個程序所調用。

 bash程序的調試

  在編程過程中難免會出錯,有的時候,調試程序比編寫程序花費的時間還要多,Shell程序同樣如此。

  Shell程序的調試主要是利用bash命令解釋程序的選擇項。調用bash的形式是:

  bash -選擇項Shell程序文件名

  幾個常用的選擇項是:

  -e 如果一個命令失敗就立即退出。

  -n 讀入命令但是不執行它們。

  -u 置換時把未設置的變數看做出錯。

  -v 當讀入Shell輸入行時把它們顯示出來。

  -x 執行命令時把命令和它們的參數顯示出來。

  上面的所有選項也可以在Shell程序內部用「set -選擇項」的形式引用,而「set +選擇項」則將禁止該選擇項起作用。如果只想對程序的某一部分使用某些選擇項時,則可以將該部分用上面兩個語句包圍起來。

  (1)未置變數退出和立即退出

  未置變數退出特性允許用戶對所有變數進行檢查,如果引用了一個未賦值的變數就終止Shell程序的執行。Shell通常允許未置變數的使用,在這種情況下,變數的值為空。如果設置了未置變數退出選擇項,則一旦使用了未置變數就顯示錯誤信息,並終止程序的運行。未置變數退出選擇項為-u。

  當Shell運行時,若遇到不存在或不可執行的命令、重定向失敗或命令非正常結束等情況時,如果未經重新定向,該出錯信息會顯示在終端屏幕上,而Shell程序仍將繼續執行。要想在錯誤發生時迫使Shell程序立即結束,可以使用-e選項將Shell程序的執行立即終止。

  (2)Shell程序的跟蹤

  調試Shell程序的主要方法是利用Shell命令解釋程序的-v或-x選項來跟蹤程序的執行。-v選擇項使Shell在執行程序的過程中,把它讀入的每一個命令行都顯示出來,而-x選擇項使Shell在執行程序的過程中把它執行的每一個命令在行首用一個+加上命令名顯示出來。並把每一個變數和該變數所取的值也顯示出來。因此,它們的主要區別在於:在執行命令行之前無-v,則顯示出命令行的原始內容,而有-v時則顯示出經過替換后的命令行的內容。

  除了使用Shell的-v和-x選擇項以外,還可以在Shell程序內部採取一些輔助調試的措施。例如,可以在Shell程序的一些關鍵地方使用echo命令把必要的信息顯示出來,它的作用相當於C語言中的printf語句,這樣就可以知道程序運行到什麼地方及程序目前的狀態。

[火星人 ] SHELL中的變數已經有873次圍觀

http://coctec.com/docs/linux/show-post-187578.html