kooyee ‘s blog

          開源軟件, 眾人努力的結晶, 全人類的共同財富
          posts - 103, comments - 55, trackbacks - 0, articles - 66
             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          shell基礎學習系列(2):學習shell變量

          Posted on 2008-01-25 18:39 kooyee 閱讀(516) 評論(0)  編輯  收藏 所屬分類: Lniux/Unix
          1、登陸過程:

          第一步:鍵入用戶名和密碼
          第二步:系統通過查詢/etc/passwd來檢測是否為有效用戶
          第三步:如果登陸正確并且密碼有效,則系統執行環境設置文件/etc/profile-->.bash_profile。

          一般情況下,root的權限太高,為了防止誤操作造成系統崩潰,我現在的做法是以一個普通用戶的身份登陸,重新定制環境,需要root權限時以su指令切換過去執行。這樣比較安全。對于shell變量的定制,有新的理解。變量的作用很多,可以定制用戶本身的工作環境,可以保存有用的信息,也可以暫時保存信息。所以出現了下面變量:

          1)本地變量。只是在當前shell生命期的腳本中使用,一旦shell中啟動另一個進程或者退出,則失效。好處就是不會對其他的shell或者進程產生影響。

          2)環境變量。在建立嵌入式交叉編譯環境的工具鏈時設置過環境變量,在這里算是對環境變量的位置特點比較清晰了。環境變量用于所有用戶進程,登錄進程稱為父進程,shell中執行的用戶進程稱為子進程。按照傳統方法,所有環境變量均為大寫,這點與本地變量不同。而且,環境變量在應用于用戶進程前,必須用export命令導出,而本地變量不需要。環境變量的兩種定制方法前面已經掌握了,在命令行中定制用戶注銷時就會丟失,所以最好還是在.bash_profile中定制。

          3)位置變量。這種為特殊變量,因為它們是只讀的。它的作用是向一個shell腳本傳遞參數,用位置參數的方式完成此功能。參數數目可以任意多,但是只有前9個可以被訪問,不過使用shift命令可以改變這個限制。參數從第一個開始,在第9個結束;每個訪問參數前都要加$符號。其中第一個參數為0,表示預留保存實際腳本名稱,無論腳本是否有參數,此值均可用。以前為openvpn的啟動看過一個腳本,實質上就是使用了位置變量。現在才理解,也能夠編寫此類腳本了。

          4)特定參數變量。為特殊變量,只讀。共有7個特定變量,在編程時用的比較多。

          $# 傳遞到腳本的參數個數
          $* 以一個單字符串顯示所有向腳本傳遞的參數,與位置變量不同,此選項參數可以超過9個。
          $$ 腳本運行的當前進程ID號
          $! 后臺運行的最后一個進程的進程ID號
          $@ 與$#相同,但是使用時加引號,并在引號中返回每個參數
          $- 顯示shell使用的當前選項,與set命令功能相同
          $? 顯示最后命令的退出狀態,0表示沒有錯誤,其他表明錯誤。

          2、密碼文件/etc/passwd的格式:7個域

          登陸名:加密的密碼:uid:gid:用戶全名:用戶home目錄:用戶的shell路徑
          以前總結過忘記root密碼的處理方法,當時只是依葫蘆畫瓢,現在才明白原理。只要將加密的密碼域去除,密碼自然也就沒有了。即“::”
           
          -------------------------------------
          實例設置1
          注:使用RedHat 9.0默認的bash shell
           
          嵌入式shell變量中有一些預留的環境變量,比如HOME,PATH等?,F在要利用PS1,PS2來定制自己的命令提示符。
           
          PS1:基本提示符包含shell提示符,缺省是對超級用戶為#,其他為$。
          在默認情況下,我的命令提示符如下:
          [armlinux@lqm armlinux]$ echo $PS1
          [\u@\h \W]\$
          其中\u代表用戶名,\h代表主機名,\W代表當前的文件夾。
          現在我希望我的命令提示符由如下幾個部分組成,首先要顯示用戶名,然后要顯示絕對路徑,方便使用。那么就可以用如下的命令定制:
          [armlinux@lqm armlinux]$PS1="\u: \`pwd\`>"
          armlinux: /home/armlinux>
          如果想設置系統主機名做提示符,則只需令PS1="`hostname`>"即可。
          要想始終起作用,當然是修改.bash_profile文件,前面剛剛學了。
           
          PS2:為附屬提示符,缺省符號為>。當執行多行命令時,出現的符號。這個一般我習慣用默認的。
          舉例:
          armlinux: /home/armlinux>cat >>test<<EOF
          > test
          > test
          > test
          > EOF
          armlinux: /home/armlinux>cat test
          test
          test
          test
          如果設置成"@:",則顯示如下:
          armlinux: /home/armlinux>PS2="@:"
          armlinux: /home/armlinux>cat >>test<<EOF
          @:test
          @:test
          @:test
          @:EOF
          armlinux: /home/armlinux>cat test
          test
          test
          test
          -------------------------------------

          實例設置2

          注:使用RedHat 9.0默認的bash shell

           

          1 使用命令echo顯示環境變量

           

          #本例使用echo顯示常見的變量HOME

          $ echo $HOME  

          /home/lqm

           

          2 設置一個新的環境變量

           

          variable-name=value;export variable-name

          或者

          export variable-name=value

           

          $ export HELLO=”Hello!”

          $ echo $HELLO

          Hello!

           

          3 使用env命令顯示所有的環境變量

           

          $ env

          SSH_AGENT_PID=1875

          HOSTNAME=lqm

          SHELL=/bin/bash

          TERM=xterm

          HISTSIZE=1000

          ……

           

          4  使用set命令顯示所有本地定義的Shell變量

           

          $ set

          BASH=/bin/bash

          ……

           

          5  使用unset命令來清除環境變量

           

          $ export TEST=”test”      #增加一個環境變量TEST

          $ env | grep TEST           #此命令有輸出,證明環境變量TEST已經存在了

          TEST=test

          $ unset $TEST                #刪除環境變量TEST

          $ env | grep TEST           #此命令無輸出,證明環境變量TEST已經存在了

           

          6  使用readonly命令設置只讀變量

          如果使用了readonly命令的話,變量就不可以被修改或清除了。示例如下:

           

          $ export TEST="Test..."                                        #增加一個環境變量TEST

          $ readonly TEST                                                   #將環境變量TEST設為只讀

          $ unset TEST                                                        #會發現此變量不能被刪除

          -bash: unset: TEST: cannot unset: readonly variable
          $ TEST="New"                                                     #
          會發現此變量不能被修改

          -bash: TEST: readonly variable

           

          C程序來訪問和設置環境變量

          對于C程序的用戶來說,可以使用下列三個函數來設置或訪問一個環境變量。

          getenv()訪問一個環境變量。輸入參數是需要訪問的變量名字,返回值是一個字符串。如果所訪問的環境變量不存在,則會返回NULL。

          setenv()在程序里面設置某個環境變量的函數。

          unsetenv()清除某個特定的環境變量的函數。

          另外,還有一個指針變量environ,它指向的是包含所有的環境變量的一個列表。下面的程序可以打印出當前運行環境里面的所有環境變量:

           

          #include <stdio.h>

          extern char**environ;

          int main ()

          {

          char**var;

          for (var =environ;*var !=NULL;++var)

          printf ("%s \n ",*var);

          return 0;

          }

           

          8      通過修改環境變量定義文件來修改環境變量。

          需要注意的是,一般情況下,這僅僅對于普通用戶適用,避免修改根用戶的環境定義文件,因為那樣可能會造成潛在的危險。

           

          $cd                                     #到用戶根目錄下

          $ls -a                                  #查看所有文件,包含隱藏的文件

          $vi .bash_profile                 #修改環境變量定義文件

           

          紅色部分也可以用一條語句代替:$vi ~/.bash_profile。在這里,~實際上是shell變量的擴展。它包含著內建命令cd。可以這樣理解,~就是你當前登錄shell的根目錄的絕對路徑。假設你的當前用戶是armlinux,那么你執行ls ~,將會顯示/home/armlinux文件夾下的內容。同樣的,$vi ~/.bash_profile展開后,實際上是$vi /home/armlinux/.bash_profile。所以,很容易理解為什么與紅色部分等價了。

           

          然后編輯你的PATH聲明,其格式為:

          PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>

          你可以自己加上指定的路徑,中間用冒號隔開。環境變量更改后,在用戶下次登陸時生效,如果想立刻生效,則可執行下面的語句:$source .bash_profile。如果在命令行中定制環境變量,那么你所設置的環境變量的生命期就是你當前shell用戶的登錄時間。一旦退出,那么環境變量也就失效了。所以,如果想只要登錄改用戶,就要使環境變量生效,還是在.bash_profile中修改。至于原因,這就與shell的激活模式相關了,可了解相關內容。

           

          需要注意的是,最好不要把當前路徑”./”放到PATH里,這樣可能會受到意想不到的攻擊。完成后,可以通過$ echo $PATH查看當前的搜索路徑。這樣定制后,就可以避免頻繁的啟動位于shell搜索的路徑之外的程序了。

          主站蜘蛛池模板: 佛学| 噶尔县| 循化| 宾川县| 交城县| 建瓯市| 邹平县| 青田县| 晋城| 云林县| 株洲县| 砀山县| 磴口县| 益阳市| 手游| 凤阳县| 巧家县| 襄垣县| 栾川县| 姚安县| 固阳县| 长丰县| 宣汉县| 鄂尔多斯市| 东乡| 商河县| 罗江县| 原平市| 黄梅县| 洛川县| 张北县| 启东市| 九江县| 汶上县| 梅州市| 浦江县| 顺义区| 姚安县| 贵溪市| 呼伦贝尔市| 扎兰屯市|