第六章 shell學習之變數和引用

來源:互聯網
上載者:User

標籤:shell 變數 引用

變數

本地變數:類似於局部變數,只在當前shell進程有效

環境變數:適用於所有登入進程所產生的子進程

位置參數:用於向shell指令碼傳遞參數,唯讀

變數替換和賦值

引用變數值就稱為變數替換,$就為變數替換符號,如a為變數名則$a或${a}為變數值

將值賦給某個變數名就稱為變數賦值,格式:variable=value或${ variable=value },如值中包含空格則必須用""

清除變數的值:

unset 變數名

設定唯讀變數:

variable=value

readonly variable

還可以用declare和typeset實現

查看系統中的所有唯讀變數:

[[email protected] tmp]# readonly 

declare -ar BASH_VERSINFO=‘([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")‘

declare -ir EUID="0"

...

變數賦值的模式

1.variable:?value或variable?value

對未賦值的variable顯示系統錯誤

[[email protected] tmp]# echo ${a:?blue}

bash: a: blue

[[email protected] tmp]# a=black

[[email protected] tmp]# echo ${a:?blue}

black

2.variable:=value

對未賦值的variable,將value值賦給它

[[email protected] tmp]# a=black

[[email protected] tmp]# echo ${a:=blue}

black

[[email protected] tmp]# unset a

[[email protected] tmp]# echo ${a:=blue}

blue

[[email protected] tmp]# echo $a

blue

3.variable:-value

對未賦值的variable,返回value,但是variable仍未賦值

[[email protected] tmp]# unset a

[[email protected] tmp]# echo ${a:-blue}

blue

[[email protected] tmp]# echo ${a:?blue}

bash: a: blue

無類型的shell指令碼變數

shell指令碼變數是無類型的,並且同時具有數字型和字元型兩種賦值,可以不用預定義變數而直接使用,數字型的初始值為0,字元型的初始值為空白

[[email protected] tmp]# cat a.sh 

#! /bin/sh

c=""

echo "c=$c"

let "c+=1"    #let命令用於執行算數運算,let "c+=1"等價於c+=1

echo "c=$c"

echo "e=$e"

let "e+=1"

echo "e=$e"

e="hello"          #此時該變數的數字值又變為0

echo "e=$e"

let "e+=2"

echo "e=$e"

[[email protected] tmp]# ./a.sh 

c=

c=1

e=

e=1

e=hello

e=2

環境變數

父進程的環境變數可以傳遞給子進程,但是子進程的環境變數(或者修改了父進程定義的環境變數)傳遞不了也影響不了父進程

定義環境變數:

ENVIRON-VARIABLE=value

export ENVIRON-VARIABLE

習慣環境變數用大寫

export表明此變數為環境變數

清除環境變數:

unset ENVIRON-VARIABLE

重要的環境變數:

1.PWD和OLDPWD

PWD記錄目前的目錄,OLDPWD記錄舊的工作目錄

[[email protected] tmp]# echo $PWD

/tmp

[[email protected] tmp]# cd

[[email protected] ~]# echo $PWD

/root

[[email protected] ~]# echo $OLDPWD

/tmp

2.PATH

shell為每個輸入命令搜尋PATH中的目錄列表

[[email protected] ~]# echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

[[email protected] ~]# export PATH=$PATH:/tmp/bin      #添加新路徑

[[email protected] ~]# echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/tmp/bin

3.HOME

使用者家目錄的路徑

[[email protected] ~]# echo $HOME

/root

4.SHELL

儲存預設的shell值(/bin/bash)

5.USER和UID

已登入使用者的名字和已登入使用者的ID

[[email protected] ~]# echo $USER $UID

root 0

6.PPID和$

$PPID當前進程的父進程號,$$為當前進程的進程號

7.PS1和PS2

分別為開頭的提示符和分行的提示符(即命令分多行輸入時的提示符)

[[email protected] ~]# echo $PS1

[\[email protected]\h \W]\$

[[email protected] ~]# echo $PS2

>

\u代表目前使用者名

\h代表主機名稱

\H代表主機名稱和網域名稱

\W代表當前工作目錄的名字

\w代表當前工作目錄的完整路徑

\$ UID為0則顯示#,否則列印$

8.IFS

指定shell的輸入欄位分隔字元,預設為空白格

[[email protected] ~]# export IFS=" "

[[email protected] ~]# echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/tmp/bin

[[email protected] ~]# export IFS=:

[[email protected] ~]# echo $PATH

/usr/kerberos/sbin /usr/kerberos/bin /usr/local/sbin /usr/local/bin /sbin /bin /usr/sbin /usr/bin /usr/X11R6/bin /root/bin /tmp/bin

環境變數設定檔

在使用者的根目錄中,為隱藏檔案

1.  .bash_profile

使用者登入時自動執行,初始化環境變數,如果不存在該檔案則執行/etc/profile

可以自己加入新的環境變數,並且執行. .bash_profile或者source .bash_profile立即生效(登出也可以)

source命令等價於.命令

直接執行檔案是啟動一個子shell,而子shell指令碼設定的環境變數無法影響當前shell指令碼,soure命令(或.命令)讓簡本在當前shell執行

[[email protected] ~]# cat .bash_profile 

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

        . ~/.bashrc

fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

2.  .bashrc

設定子shell的環境變數,使得使用者登入時的環境變數設定與子shell的環境變數設定相分離,提高靈活性

3.   .bash_logout

在使用者登出時執行,可以寫入清楚某些環境變數的命令,也可以不存在

export PATH

unset USERNAME

父進程,子進程環境變數關係

子進程能繼承父進程的環境變數,但是子進程修改父進程的環境變數只對子進程有效,不影響父進程環境變數,子進程建立的環境變數父進程也接收不到,而本地變數則互不影響

例:

[[email protected] tmp]# cat father.sh 

#! /bin/bash

fatherLocal="fatherLocal"

fatherEnviron="fatherEnviron"

export fatherEnviron

echo "in fahter.sh"

echo "father process ID is $$"

echo "fatherLocal is $fatherLocal"

echo "fatherEnviron is $fatherEnviron"

$PWD/child.sh

echo "return to father.sh"

echo "fatherLocal is $fatherLocal"

echo "fatherEnviron is $fatherEnviron"

[[email protected] tmp]# cat child.sh 

#! /bin/bash

echo "in child.sh"

echo "child process ID is $$ and my father is $PPID"

echo "fatherLocal is $fatherLocal"

echo "fatherEnviron is $fatherEnviron"

echo "change faterEnviron"

export "fatherEnviron=redefinfatherEnviron"

echo "new fatherEnviron is $fatherEnviron"

結果:

[[email protected] tmp]# ./father.sh 

in fahter.sh

father process ID is 29171

fatherLocal is fatherLocal

fatherEnviron is fatherEnviron

in child.sh

child process ID is 29172 and my father is 29171

fatherLocal is 

fatherEnviron is fatherEnviron

change faterEnviron

new fatherEnviron is redefinfatherEnviron

return to father.sh

fatherLocal is fatherLocal

fatherEnviron is fatherEnviron

位置參數

$0 指令碼名稱

$1 第一個參數

${10} 第十個參數,從10開始要加{}

$# 參數個數

$*或[email protected] 所有參數,不包括$0

$$ 進程號

$PPID 父進程號

$? 退出狀態,0表示沒有錯誤,非0表示有錯誤

引用

引用是屏蔽特殊字元的特殊意義,而將其解釋為字面意義

"" 引用除了貨幣符號($),反引號(``),反斜線(\)之外的所有字元

‘‘ 引用除了‘‘本身的所有字元

`` 反引號,shell將反引號中的內容解釋為系統命令

\ 反斜線,屏蔽下一個字元的特殊含義

對於變數加雙引號可以保留多個空格(還有換行),而不解釋為欄位的分隔字元(IFS預設為空白),即雙引號有防止變數變分隔字元的作用

例:

[[email protected] tmp]# a="a       b       c"

[[email protected] tmp]# echo $a

a b c

[[email protected] tmp]# echo "$a"

a       b       c

[[email protected] tmp]# echo ‘$a‘

$a

[[email protected] tmp]# echo ‘why can‘t I‘m you are‘

why cant Im you are

[[email protected] tmp]# echo "why can‘t I‘m you are"

why can‘t I‘m you are

命令替換

將命令執行的標準輸出替換該命令所在的位置

反引號(``)和$()

$()命令可以嵌套

$()將\就是\,而反引號(``)將\解釋為空白格

利用反引號可以將其它語言執行的結果賦值給shell變數,從而用shell處理

例:

[[email protected] tmp]# echo \\

\

[[email protected] tmp]# echo $(echo \\)

\

[[email protected] tmp]# echo `echo \\`

#空白行

command `echo`   #command代表任何命令,這裡相當於不帶參數

command "`echo`"  #帶Null 字元串參數

command `echo x y`  #帶兩個參數,為x和y

command "`echo x y`"   #帶一個參數,為x y

轉義

作用:

1.解除一些特殊字元的含義

2.單個\在命令列中為出現二級提示符,在shell指令碼中同樣適用

3.在echo、sed、awk等命令中讓一些字母能夠表達特殊含義

1.

variable="()\\{}\$\""

echo $variable

echo "$variable"

IFS=‘\‘                        #改變輸入變數分隔字元

echo $variable

echo "$variable"        #雙引號有防止變數變分隔字元的作用,保留變數分隔字元

[[email protected] tmp]# ./a3.sh 

()\{}$"

()\{}$"

() {}$"

()\{}$"

2.

2.1

[[email protected] tmp]# echo \

> hello world

hello world

2.2

[[email protected] tmp]# echo \     #echo可以用""也可以不用

> "hello world"

hello world

2.3

[[email protected] tmp]# echo "\"   #注意這和前面兩個存在本質的區別,這裡的\轉義了"導致缺少後",補全命令才結束,和2.4同

> hello world"

"

hello world

2.4

[[email protected] tmp]# echo "

> hello

> world"

hello

world

2.5

[[email protected] tmp]# variable=\

> hello world

bash: world: command not found         #變數賦值如果有空格必須用引號

2.6

[[email protected] tmp]# variable=\

> "hello world"

[[email protected] tmp]# echo $variable

hello world

2.7

[[email protected] tmp]# cat a5.sh 

#! /bin/bash

echo \                                                   #單個/在shell指令碼中同樣適用

hello world

[[email protected] tmp]# ./a5.sh

hello world

3.

\後跟字母的特殊含義:

\n 新的一行

\r 返回

\t tab鍵

\v或\f 換行但游標忍停留在原來的位置(橫座標相同)

\b 退格鍵

\a 發出警報聲

\0xx ASCII碼0xx對應的字元

例:

[[email protected] tmp]# echo hello\b\101

hellob101

[[email protected] tmp]# echo $‘hello\b\101‘        #和-e ""基本等價

hellA

[[email protected] tmp]# echo -e "hello\b\0101"    #注意\0101的0,沒有0不能解析成ASCII碼

hellA

[[email protected] tmp]# echo -e "hello\b\101"

hell\101

[[email protected] tmp]# echo -e hello\b\101        #注意-e沒有""同樣不能解析

hellob101

注意:

echo [選項] [字串]

選項-e表示將轉移符(\)後跟字元形成的特殊字元解釋成特殊意義

選項-n表示輸出文字後不換行:

[[email protected] tmp]# echo -n "hello"

hello[[email protected] tmp]# 


本文出自 “flyclc” 部落格,請務必保留此出處http://flyclc.blog.51cto.com/1385758/1540166

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.