国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
linux超級基礎(chǔ)系列——shell變量(本地變量和環(huán)境變量)

linux超級基礎(chǔ)系列——shell變量(本地變量和環(huán)境變量)

為使shell編程更有效,系統(tǒng)提供了一些shell變量。shell變量可以保存諸如路徑名、文件名或者一個數(shù)字這樣的變量名。shell將其中任何設(shè)置都看做文本字符串。
有兩種變量,本地和環(huán)境。嚴格地說可以有4種,但其余兩種是只讀的,可以認為是特殊變量,它用于向shell腳本傳遞參數(shù)。
1 什么是shell變量
按照定義來說,變量是存儲設(shè)備中的一些可讀寫的存儲單元.變量可以定制用戶本身的工作環(huán)境。使用變量可以保存有用信息,使系統(tǒng)獲知用戶相關(guān)設(shè)置。變量也用于保存暫時信息。例如:一變量為EDITOR,系統(tǒng)中有許多編輯工具,但哪一個適用于系統(tǒng)呢?將此編輯器名稱賦給EDITOR,這樣,在使用cron或其他需要編輯器的應(yīng)用
時,這就是你將一直使用的EDITOR取值,并將之用作缺省編輯器。
舉例來說,登錄的審核系統(tǒng)需要編輯。在菜單中選擇此選項時,應(yīng)用查詢EDITOR變量值,其值為vi。系統(tǒng)知道可使用此編輯器(用命令echo $EDITOR看看自己的?)。
另一個例子需要登錄數(shù)據(jù)庫系統(tǒng),鍵入下列命令:
$ isql -Udavet -Pabcd -Smethsys
這里- S為正在連接的服務(wù)器名稱。有一變量DSQUERY保存服務(wù)器名稱值。設(shè)置服務(wù)器名稱值到DSQUERY變量,這樣如果登錄時不使用-S提供服務(wù)器名稱,應(yīng)用將查詢DSQUERY變量,并使用其取值作為服務(wù)器名稱。需要做的全部工作就是鍵入下列命令:
$ isql -Udavet -Pabcd
工作方式同上例。
2 本地變量
本地變量在用戶現(xiàn)在的shell生命期的腳本中使用。例如,本地變量file-name取值為loop.doc,這個值只在用戶當前shell生命期有意義。如果在shell中啟動另一個進程或退出,此值將無效。這個方法的優(yōu)點就是用戶不能對其他的shell或進程設(shè)置此變量有效。
使用變量時,如果用花括號將之括起來,可以防止shell誤解變量值,盡管不必一定要這樣做,但這確實可用。要設(shè)置一本地變量,格式為:
$ variable-name=value 或 $ {variable-name=value}
注意,等號兩邊可以有空格。如果取值包含空格,必須用雙引號括起來。shell變量可以用大小寫字母。
變量設(shè)置時的不同模式:
Variable-name=value  設(shè)置實際值到variable-name
Variable-name+value  如果設(shè)置了variable-name,則重設(shè)其值
Variable-name:?value  如果未設(shè)置variable-name,顯示未定義用戶錯誤信息
Variable-name?value  如果未設(shè)置variable-name,顯示系統(tǒng)錯誤信息
Variable-name:=value  如果未設(shè)置variable-name,設(shè)置其值
Variable-name:-value  同上,但是取值并不設(shè)置到variable-name,可以被替換
2.1 顯示變量
使用echo命令可以顯示單個變量取值,并在變量名前加$,例如:
echo $LOGNAME
$dave
可以結(jié)合使用變量,下面將錯誤信息和環(huán)境變量LOGNAME設(shè)置到變量error-msg。
$ERROR_MSG="sorry, there is not $LOGNAME"
$echo "$ERROR_MSG"
$sorry, there is not dave
上面例子中,shell首先顯示文本,然后查找變量$LOGNAME,最后擴展變量以顯示整個變量值。
2.2 清除變量
使用unset命令清除變量。
unset variable-name
2.3 顯示所有本地shell變量
使用不加任何參數(shù)的set命令顯示所有本地定義的shell變量。
set輸出可能很長。查看輸出時可以看出shell已經(jīng)設(shè)置了一些用戶變量以使工作環(huán)境更加容易使用。
2.4 結(jié)合變量值
將變量并排可以使變量結(jié)合在一起:
echo $var_1$var_2
2.5 測試變量是否已經(jīng)設(shè)置
有時要測試是否已設(shè)置或初始化變量。如果未設(shè)置或初始化,就可以使用另一值。此命令格式為:
$ {variable:-value}
意即如果設(shè)置了變量值,則使用它,如果未設(shè)置,則取新值。例如:
$color=blue
$echo "The sky is ${color:-grey} today"
The sky is blue today
變量colour取值blue,echo打印變量colour時,首先查看其是否已賦值,如果查到,則使用該值?,F(xiàn)在清除該值,再來看看結(jié)果。
$color=blue
$unset color
$echo "The sky is ${color:-grey} today"
The sky is grey today
上面的例子并沒有將實際值傳給變量,需使用下述命令完成此功能:
$ {variable:=value}
2.6 使用變量來保存系統(tǒng)命令參數(shù)
可以用變量保存系統(tǒng)命令參數(shù)的替換信息。下面的例子使用變量保存文件拷貝的文件名信息。變量source保存passwd文件的路徑。
$ source="/etc/passwd"
$ cd $source
2.7 設(shè)置只讀變量
如果設(shè)置變量時,不想再改變其值,可以將之設(shè)置為只讀方式。如果有人包括用戶本人想要改變它,則返回錯誤信息。格式如下:
variable-name=value
readonly variable-name
設(shè)為只讀后,任何改變其值的操作將返回錯誤信息。要查看所有只讀變量,使用命令readonly即可。
3 環(huán)境變量
環(huán)境變量用于所有用戶進程(經(jīng)常稱為子進程)。登錄進程稱為父進程。s h e l l中執(zhí)行的用戶進程均稱為子進程。不像本地變量(只用于現(xiàn)在的s h e l l)環(huán)境變量可用于所有子進程,這包括編輯器、腳本和應(yīng)用。
環(huán)境變量可以在命令行中設(shè)置,但用戶注銷時這些值將丟失,因此最好在. profile文件中定義。系統(tǒng)管理員可能在/etc/profile文件中已經(jīng)設(shè)置了一些環(huán)境變量。將之放入profile文件意味著每次登錄時這些值都將被初始化。傳統(tǒng)上,所有環(huán)境變量均為大寫。環(huán)境變量應(yīng)用于用戶進程前,必須用export命令導出。環(huán)境變量與本地變量設(shè)置方式相同。
3.1 設(shè)置環(huán)境變量
VARIABLE-NAME=value;export VARIABLE-NAME
在兩個命令之間是一個分號,也可以這樣寫:
VARIABLE-NAME=value
export VARIABLE-NAME
3.2 顯示環(huán)境變量
顯示環(huán)境變量與顯示本地變量一樣,用echo命令即可。
使用env命令可以查看所有的環(huán)境變量。
3.3 清除環(huán)境變量
使用unset命令清除環(huán)境變量
unset VARIABLE-NAME
3.4 嵌入shell變量
Brourne shell 有一些預(yù)留的環(huán)境變量名,這些變量名不能用作其他用途。通常在/etc/profile中建立這些嵌入的環(huán)境變量,但也不完全是,這取決于用戶自己。以下是嵌入shell變量列表。
1. CDPATH
改變目錄路徑變量,保留一系列由冒號隔開的路徑名,用于cd命令。如果設(shè)置了CDPATH,cd一個目錄時,首先查找CDPATH,如果CDPATH指明此目錄,則此目錄成為當前工作目錄。例子如下:
$ CDPATH=:/home/dave/bin:/usr/local/apps ;export CDPATH.
如果要
$ cd apps
cd命令首先在CDPATH中查找目錄列表,如果發(fā)現(xiàn)apps,則它成為當前工作目錄。
2. EXINIT
EXINIT變量保存使用vi編輯器時的初始化選項。例如,調(diào)用vi時,要顯示行號,且在第10個空格加入tab鍵,命令為:
$ EXINIT=‘set nu tab=10‘;export EXINIT
3. HOME
HOME目錄,通常定位于passwd文件的倒數(shù)第2列,用于保存用戶自身文件。設(shè)置了HOME目錄,可以簡單使用cd命令進入它。也可以用
$ cd $HOME
4. IFS
IFS用作shell指定的缺省域分隔符。原理上講域分隔符可以是任意字符,但缺省通常為空格、新行或tab鍵。IFS在分隔文件或變量中各域時很有用。下面的例子將IFS設(shè)置為冒號,然后echo $PATH變量,給出一個目錄分隔開來的可讀性很強的路徑列表。
/sbin /bin /usr/bin /home/dave/bin
要設(shè)置其返回初始設(shè)置:
$ IFS=<space><tab>; export IFS
這里<space><tab>為空格和tab鍵。
5. LOGNAME
此變量保存登錄名,應(yīng)該為缺省設(shè)置,但如果沒有設(shè)置,可使用下面命令完成它:
$ LOGNAME=‘dave‘; export LOGNAME
6. MAIL
MAIL變量保存郵箱路徑名,缺省為/var/spool/mail/<loginname>。shell周期性檢查新郵件,如果有了新郵件,在命令行會出現(xiàn)一個提示信息。如果郵箱并不在以上指定位置,可以用MAIL設(shè)置。
$ MAIL=/usr/mail/dave ;export MAIL
7. MAILCHECK
MAILCHECK缺省每60s檢查新郵件,但如果不想如此頻繁檢查新郵件,比如設(shè)為每2m,使用命令:
$ MAILCHECK=120 ;export MAILCHECK
8. MAILPATH
如果有多個郵箱要用到MAILPATH,此變量設(shè)置將覆蓋MAIL設(shè)置。
$ MAILPATH=/var/spool/dave:/var/spool/admin ;export MAILPATH
上面的例子中,MAIL檢測郵箱dave和admin。
9. PATH
PATH變量保存進行命令或腳本查找的目錄順序,正確排列這個次序很重要,可以在執(zhí)行命令時節(jié)省時間。你一定不想在已知命令不存在的目錄下去查找它。通常情況,最好首先放在HOME目錄下,接下來是從最常用到一般使用到不常用的目錄列表次序。如果要在當前工作目錄下查詢,無論在哪兒,均可以使用句點操作。目錄間用冒號分隔,例如:
$ PATH=$HOME/bin:.:/bin:/usr/bin ;export PATH
使用上面的例子首先查找HOME/bin目錄,然后是當前工作目錄,然后是/bin,最后是
/usr/bin。
PATH可以在系統(tǒng)目錄下/etc/profile中設(shè)置,也可以使用下面方法加入自己的查找目錄。
$PATH=$PATH:/$HOME/bin:.;export PATH
這里使用了/etc/profile中定義的PATH,并加入$HOME/bin和當前工作目錄。一般來說,在查找路徑開始使用當前工作目錄不是一個好辦法,這樣很容易被其他用戶發(fā)現(xiàn)。
10. PS1
基本提示符包含shell提示符,缺省對超級用戶為#,其他為$??梢允褂萌魏畏栕魈崾痉?
11. PS2
PS2為附屬提示符,缺省為符號>。PS2用于執(zhí)行多行命令或超過一行的一個命令。
12. SHELL
SHELL變量保存缺省shell,通常在/etc/passwd中已設(shè)置,但是如有必要使用另一個shell,
可以用如下方法覆蓋當前shell:
13. TERMINFO
終端初始化變量保存終端配置文件的位置。通常在/usr/lib/terminfo或/usr/share/terminfo
$ TERMINFO=/usr/lib/terminfo ;export TERMINFO
14. TERM
TERM變量保存終端類型。設(shè)置TERM使應(yīng)用獲知終端對屏幕和鍵盤響應(yīng)的控制序列類型,常用的有vt100、vt200、vt220-8等。
$ TERM=vt100 ;export TERM
15. TZ
時區(qū)變量保存時區(qū)值,只有系統(tǒng)管理員才可以更改此設(shè)置。例如:
$echo $TZ
GMT2EDT
返回值表明正在使用格林威治標準時間,與GMT時差為2,并作EDT保存。
3.5 其他環(huán)境變量
還有一些預(yù)留的環(huán)境變量。其他系統(tǒng)或命令行應(yīng)用將用到它們。以下是最常用的一些,注意這些值均未有缺省設(shè)置,必須顯示說明。
1. EDITOR
設(shè)置編輯器,最常用。
$ EDITOR=vi ;export EDITOR
2. PWD
當前目錄路徑名,用cd命令設(shè)置此選項。
3. PAGER
保存屏幕翻頁命令,如pg、more,在查看man文本時用到此功能。
$ PAGER=‘pg -f -p%d‘ ;export PAGER
4. MANPATH
保存系統(tǒng)上man文本的目錄。目錄間用冒號分隔。
$ MANPATH=/usr/apps/man:/usr/local/man ;export MANPATH
5. LPDEST或PRINTER
保存缺省打印機名,用于打印作業(yè)時指定打印機名。
$ LPDEST=hp3si-systems
3.6 set命令
在$HOME.profile文件中設(shè)置環(huán)境變量時,還有另一種方法導出這些變量。使用set命令- a選項,即set -a指明所有變量直接被導出。不要在/etc/profile中使用這種方法,最好只在自己的$HOME/.profile文件中使用。
3.7 將變量導出到子進程
shell新用戶碰到的問題之一是定義的變量如何導出到子進程。前面已經(jīng)討論過環(huán)境變量的工作方式,現(xiàn)在用腳本實現(xiàn)它,并在腳本中調(diào)用另一腳本(這實際上創(chuàng)建了一個子進程)。以下是兩個腳本列表father和child。father腳本設(shè)置變量film,取值為AFewGoodMen,并將變量信息返回屏幕,然后調(diào)用腳本child,這段腳本顯示第一個腳本里的變量film,然后改變其值為DieHard,再將其顯示在屏幕上,最后控制返回father腳本,再次顯示這個變量。
$more father
#!/bin/sh
#father script
echo "this is the father"
FILM="A Few Good Men"
echo "I like the film :$FILM"
#call the child script
./child
echo "back to father"
echo "and the film is :$FILM"
$more child
#!/bin/sh
#child script
echo "called from father..i am the child"
echo "film is :$FILM"
FILM="Die Hard"
echo "changing film to :$FILM"
看看腳本顯示結(jié)果:
this is the father
I like the film :A Few Good Men
./child: line 1: child: command not found
called from father..i am the child
film is :
changing film to :Die Hard
back to father
and the film is :A Few Good Men
因為在father中并未導出變量film,因此child腳本不能將film變量返回。如果在father腳本中加入export命令,以便child腳本知道film變量的取值,這就會工作:
$more father2
#!/bin/sh
#father2 script
echo "this is the father"
FILM="A Few Good Men"
echo "I like the film :$FILM"
#call the child script
#but export varible first
export FILM
./child
echo "back to father"
echo "and the film is :$FILM"
$ ./father2
this is the father
I like the film :A Few Good Men
called from father..i am the child
film is :A Few Good Men
changing film to :Die Hard
back to father
and the film is :A Few Good Men
因為在腳本中加入了export命令,因此可以在任意多的腳本中使用變量film,它們均繼承了film的所有權(quán)。
4 位置變量參數(shù)
本章開始提到有4種變量,本地、環(huán)境,還有兩種變量被認為是特殊變量,因為它們是只讀的。這兩種變量即為位置變量和特定變量參數(shù)。先來看一看位置變量。
如果要向一個shell腳本傳遞信息,可以使用位置參數(shù)完成此功能。參數(shù)相關(guān)數(shù)目傳入腳本,此數(shù)目可以任意多,但只有前9個可以被訪問,使用shift命令可以改變這個限制(以后將講到shift命令)。參數(shù)從第一個開始,在第9個結(jié)束;每個訪問參數(shù)前要加$符號。第一個參數(shù)為0,表示預(yù)留保存實際腳本名字。無論腳本是否有參數(shù),此值均可用。
如果向腳本傳送Did You See Th e Full Moon信息,下面的表格講解了如何訪問每一個參數(shù)。
$0           $1   $2    $3    $4   $5    $6     $7  $8  $9
腳本名字   Did  You  See  The  Full  Moon
4.1 在腳本中使用位置參數(shù)
在下面腳本中使用上面的例子。
$more param
#!/bin/sh
#param
echo "This is the script name    : $0"
echo "This is the first parameter: $1"
echo "This is the 2nd parameter  : $2"
echo "This is the third parameter: $3"
echo "This is the 6th parameter  : $6"
echo "This is the 7th parameter  : $7"
$ ./param Did You See The Full Moon
This is the script name    : ./param
This is the first parameter: Did
This is the 2nd parameter  : You
This is the third parameter: See
This is the 6th parameter  : Moon
This is the 7th parameter  :
這里只傳遞6個參數(shù),7、8、9參數(shù)為空,正像預(yù)計的那樣。注意,第一個參數(shù)表示腳本名,當從腳本中處置錯誤信息時,此參數(shù)有很大作用。
注意$0返回當前目錄路徑,如果只返回腳本名,在basename命令下參數(shù)設(shè)為$0,剛好得到腳本名字。
$more param2
#!/bin/sh
echo "this is `basename $0`calling"
$./param2
this is param2 calling
4.2 向系統(tǒng)命令傳遞參數(shù)
可以在腳本中向系統(tǒng)命令傳遞參數(shù)。下面的例子中,在find命令里,使用$1參數(shù)指定查找文件名。
$more findfile
#!/bin/sh
#findfile
find / -name $1 -print
另一個例子中,以$1向grep傳遞一個用戶id號,grep使用此id號在passwd中查找用戶全名。
$more who_is
#!/bin/sh
#who_is
grep $1 passwd | awk -F: {print $4}
4.3 特定變量參數(shù)
既然已經(jīng)知道了如何訪問和使用shell腳本中的參數(shù),多知道一點相關(guān)信息也是很有用的,有必要知道腳本運行時的一些相關(guān)控制信息,這就是特定變量的由來。共有7個特定變量:
$# 傳遞到腳本的參數(shù)個數(shù)
$* 以一個單字符串顯示所有向腳本傳遞的參數(shù)。與位置變量不同,此選項參數(shù)可超過9個
$$ 腳本運行的當前進程ID號
$! 后臺運行的最后一個進程的進程ID號
$@ 與$ #相同,但是使用時加引號,并在引號中返回每個參數(shù)
$- 顯示shell使用的當前選項,與set命令功能相同
$? 顯示最后命令的退出狀態(tài)。0表示沒有錯誤,其他任何值表明有錯誤。

特定變量的輸出使用戶獲知更多的腳本相關(guān)信息??梢詸z查傳遞了多少參數(shù),進程相應(yīng)的ID號,以免我們想殺掉此進程。
4.4 最后的退出狀態(tài)
注意,$?返回0。可以在任何命令或腳本中返回此變量以獲得返回信息。基于此信息,可以在腳本中做更進一步的研究,返回0意味著成功,1為出現(xiàn)錯誤。
下面的例子拷貝文件到/tmp,并使用$?檢查結(jié)果。
$ cp ok.txt /tmp
$ echo $?
0
現(xiàn)在嘗試將一個文件拷入一個不存在的目錄:
$ cp ok.txt /usr/bin/aaa/bbb
cp: cannot create regular file ‘/usr/bin/aaa/bbb‘: No such file or directory
$ echo $?
1
使用$?檢驗返回狀態(tài),可知腳本有錯誤,但同時發(fā)現(xiàn)cp:cannot...,因此檢驗最后退出狀態(tài)已沒有必要。在腳本中可以用系統(tǒng)命令處理輸出格式,要求命令輸出不顯示在屏幕上。為此可以將輸出重定向到/dev/null,即系統(tǒng)bin中。現(xiàn)在怎樣才能知道腳本正確與否?好,這時可以用最后退出狀態(tài)命令了。請看上一個例子的此形式的實際操作結(jié)果。
$ cp ok.txt /usr/bin/aaa/bbb >/dev/null 2>&1
$ echo $?
1
通過將包含錯誤信息的輸出重定向到系統(tǒng)bin中,不能獲知最后命令返回狀態(tài),但是通過使用$!,(其返回值為1)可知腳本失敗。檢驗?zāi)_本退出狀態(tài)時,最好將返回值設(shè)置為一個有意義的名字,這樣可以增加腳本的可讀性。
14.5 小結(jié)
變量可以使shell編程更容易。它能夠保存輸入值并提高效率。shell變量幾乎可以包含任
何值。特定變量增強了腳本的功能并提供了傳遞到腳本的參數(shù)的更多信息。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Shell 腳本面試問題大全
bash教程摘要
Linux Bash編程超詳細語法總結(jié)
linux中shell變量$#,$@,$0,$1,$2的含義解釋
shell淺談之一變量和引用
和即將用到Shell的人們談?wù)凷hell傳遞參數(shù)
更多類似文章 >>
生活服務(wù)
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服