欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
引用 第7講 Bourne Again Shell_1
第7講 Bourne Again Shell_1
Chatper 8 Bourne Again Shell
此講和下一講內容如下:
進(jìn)一步討論了shell的交互特性
討論了簡(jiǎn)單shell腳本的創(chuàng )建和運行
進(jìn)一步討論了作業(yè)控制
介紹shell編程的基本方面
討論命令歷史和別名
討論了命令行擴展
8.2 shell基礎
?8.2.1初始化文件
Shell啟動(dòng)時(shí),運行初始化文件初始化自己。登錄shell、非登錄交互式shell(比如通過(guò)命令bash)與非交互式shell(用來(lái)執行shell腳本)具體運行的初始化文件各不同。
這里討論的是bash
?1.登錄shell (包括帶—login的shell執行)
/etc/profile:首先執行的文件
~/.bash_profile、~/.bash_login、~/.profile  :依次找,執行三個(gè)中第一個(gè)找到的
?2.交互式非登錄shell
~/.bashrc:執行此文件
/etc/bashrc:許多~/.bashrc調用此文件
說(shuō)明:交互式非登錄shell從登錄shell繼承了由初始化文件設置的shell變量。
?3.非交互式shell
非交互式shell從登錄shell那里繼承了由初始化文件設置的shell變量。
BASH_ENV  非交互式shell查找環(huán)境變量BASH_ENV(或者當作為sh調用時(shí)為ENV),并執行由該變量命名的文件中的命令。
?4.建立初始化文件
用戶(hù)通常只需要主目錄下的.bash_profile和.bashrc文件
因為.bashrc中的命令可能執行多次,并且因為子shell繼承那些被輸出的變量,所以最好將那些附加已有變量的命令放置到.bash_profile文件中。如:
PATH=$PATH:$HOME/bin
此命令將home目錄的子目錄bin添加到PATH中,應該將其放置到.bash_profile文件中
?5. “.”(句點(diǎn))或者source
這兩個(gè)命令在當前shell中運行初始化文件,從而使修改生效
$ ~/.bashrc
?8.2.2符號命令
符   號
命    令
( )
子shell
$( )
命令替換
(( ))
算術(shù)表達式計算,let的同義詞(當被括起來(lái)的值中包含等號時(shí)使用)
$(( ))
算術(shù)擴展(不用于被括起來(lái)的值中包含等號的情形)
[ ]
test命令
{ }
條件表達式,類(lèi)似于[ ],但添加了字符串比較
?8.2.3  重定向標準錯誤輸出
文件描述符  文件描述符是程序發(fā)送輸出和獲取輸入的地方。當執行一個(gè)程序時(shí),運行該程序的進(jìn)程打開(kāi)了3個(gè)文件描述符,分別是:0(標準輸入)、1(標準輸出)和2(標準錯誤輸出)。重定向輸出符號(>)是1>的簡(jiǎn)寫(xiě),它通知shell重定向標準輸出。類(lèi)似地,<是0<的簡(jiǎn)寫(xiě),表示重定向標準輸入。符號2>將重定向標準錯誤輸出。
將標準輸出和標準錯誤輸出重定向到不同文件的例子
$ cat x y 1> holdl 2> ho1d2
$ cat holdl
This "is y.
$ cat ho1d2
cat: x: No such file or directory
?8.2.4  編寫(xiě)一個(gè)簡(jiǎn)單的shell腳本
shell腳本是包含shell可執行命令的文件。
shell腳本中的命令可以是用戶(hù)在shell提示符后面輸入的任何命令
除了可以使用用戶(hù)在命令行下面輸入的命令之外,shell腳本還可以使用控制流命令(也稱(chēng)為控制結構)。
shell一條接著(zhù)一條地解釋并執行shell腳本中的命令。
腳本文件可以使用任何編輯器編輯。
?1. chmod :使文件可執行
要想用shell腳本的文件名作為命令執行該腳本,用戶(hù)必須具有該腳本的文件讀權限和執行權限
當使用編輯器創(chuàng )建shell腳本的時(shí)候,該文件通常并沒(méi)有設置執行權限。
示例給出了一個(gè)名為whoson的文件,其中包含shell腳本:
$ cat whoson
date
echo "Users Currently Logged In"
who
$ whoson
bash: ./whoson: Permission denied
執行沒(méi)有執行權限(但有讀權限)的shell腳本
$ bash whoson       #這里whoson是bash的參數
給腳本文件賦執行權限:
Chmod u+x whoson
如果某文件是一個(gè)shell腳本,用戶(hù)嘗試執行這個(gè)文件時(shí),還必須具備讀訪(fǎng)問(wèn)權限。而在執行一個(gè)二進(jìn)制可執行文件(已編譯程序)時(shí),并不需要讀訪(fǎng)問(wèn)權限。
?#!指定shell
在shell腳本文件的第1行可以放置一行特殊的字符串,告訴操作系統使用哪個(gè)shell來(lái)執行這個(gè)文件。
$ cat bash_script
#! /bin/bash
echo "This is a Bourne Again Shell script. "
$ cat tcsh_script
#! /bin/tcsh
echo "This is a tcsh script. "
set person = jenny
echo "person is $person"
上例中,不管用戶(hù)當前運行的shell,此腳本都有tcsh執行
如果在#!后面沒(méi)有可執行程序名,shell將報告一個(gè)錯誤,通知沒(méi)有找到用戶(hù)要求運行的命令。
?3. #開(kāi)始一行注釋
使用注釋可使shell腳本和程序便于自己和他人閱讀和維護。Bourne Again shell和TC Shell的注釋語(yǔ)法相同。
?4. 執行shell腳本
直接輸入文件名
作為bash的參數
?8.2.5  命令分隔和命令分組
當用戶(hù)交互地向shell輸入命令時(shí),或者在編寫(xiě)shell腳本時(shí),必須分隔不同的命令
?1. 使用;和換行符分隔命令
換行符是一個(gè)獨特的命令分隔符,它將啟動(dòng)命令執行。
分號;也是一種命令分隔符,但是它并不立即啟動(dòng)命令執
$ x ; y ; z
?2. \繼續命令
當輸入一個(gè)比較長(cháng)的命令行時(shí),光標已經(jīng)到達屏幕右端,這時(shí)候可以使用反斜杠字符\在下一行繼續這條命令。反斜杠引用了換行符(也就是將其轉義),這樣shell就不會(huì )將這個(gè)換行符作為一個(gè)命令終結符對待。
?3. |和&分隔命令及其他功能
管道符號|和后臺任務(wù)符號&也是命令分隔符。它們并不開(kāi)始執行命令而是在某些方面改變命令的功能。
下一個(gè)命令行在后臺執行任務(wù)d和e,而在前臺執行任務(wù)f(shuō):
$ d & e & f
[1] 14271
[2] 14272
shell會(huì )將通過(guò)管道連接的多個(gè)命令當作一個(gè)單獨的作業(yè)。
?4. ( )命令分組
可以使用圓括號進(jìn)行命令分組。shell為每個(gè)命令組創(chuàng )建一個(gè)自身的副本,稱(chēng)為子shell。
每個(gè)子shell(作業(yè))有各自的運行環(huán)境,這就意味著(zhù)它們各自都有自己的一組與其他子shell不同值的變量。
$ (a ; b) & c &
[1] 15520
[2] 15521
上例中,任務(wù)a和b相繼啟動(dòng),c同時(shí)啟動(dòng)
$ (a ; b) & (c ; d) &
下面的腳本cpdir將復制一個(gè)目錄到另一個(gè)目錄中。第2對圓括號將創(chuàng )建一個(gè)子shell來(lái)運行管道后面的命令。因為這些圓括號,第1個(gè)tar命令的輸出可用于第2個(gè)tar命令,而不管中間的cd命令。如果沒(méi)有圓括號,第1個(gè)tar命令的輸出將會(huì )發(fā)送給cd,然后被丟棄,這是因為cd并不處理來(lái)自標準輸入的輸入數據。如果沒(méi)有這對圓括號,第1個(gè)cd命令將改變該腳本的工作目錄(同時(shí)還會(huì )導致第2個(gè)cd命令的工作目錄改變)。
$ cat cpdir
(cd $1 ; tar -cf - . ) | (cd $2 ; tar -xvf - )
$ cpdir /home/alex/sources /home/alex/memo/bibtio
?8.2.6  作業(yè)控制
下面的命令行中包含了兩個(gè)指定在后臺運行的任務(wù):
$ find . -print | sort | lpr & grep -1 alex /
tmp/* >alexfiles &
[1] 18839
[2] 18876
?1. jobs:列出作業(yè)
?2. fg或%:將作業(yè)移到前臺運行
?3. bg:將作業(yè)移到后臺運行
后臺作業(yè)要從終端進(jìn)行讀取操作時(shí),shell將停止該作業(yè),并通知用戶(hù)該作業(yè)已被停止并等待輸入。
?8.2.7  操作目錄棧
Bourne Again和TC Shell都允許用戶(hù)將其正在使用的目錄列表存放起來(lái),這樣就可以在這些目錄之間輕易移動(dòng)。這個(gè)目錄列表稱(chēng)為棧。
?1. dirs:顯示棧
dirs顯示目錄棧,為空則顯示工作目錄的名字。
$ dirs
~/literature
下面的討論基于下圖的目錄結構
?2. pushd(push directory ):將目錄壓入棧頂
pushd改變工作目錄,添加一個(gè)新的目錄到棧頂。
$ pushd ../demo
~/demo ~/literature
$ pwd
/home/sam/demo
$ pushd ../names
~/names ~/demo ~/literature
$ pwd
/home/sam/names
當不帶參數使用pushd時(shí),pushd交換棧頂最上面的兩個(gè)目錄并將新的棧頂目錄作為新的工作目錄
不管是否顯式地創(chuàng )建目錄棧,都可以使用cd– 切換到前一個(gè)目錄。為了訪(fǎng)問(wèn)目錄棧中的其他目錄,可以在調用pushd時(shí),帶上一個(gè)以加號開(kāi)頭的數字作為參數。棧中目錄的編號從棧頂開(kāi)始算起,棧頂目錄的編號是0。
下面的pushd命令繼續前一個(gè)示例
$ pushd +2
~/literature ~/demo ~/names
$ pwd
/home/sam/literature
?3. popd(pop directory ):將目錄從棧中彈出
不帶參數的popd將棧頂目錄從棧中移出,并將工作目錄改變到這個(gè)新的棧頂目錄。
$ dirs
~/literature ~/demo ~/names
$ popd
~/demo ~/names
$ pwd
/home/sam/demo
為了移出除棧頂之外的其他目錄,可以使用一個(gè)以加號開(kāi)頭的數字作為參數傳遞給popd。
$ dirs
~/literature ~/demo ~/names
$ popd +1
~/literature ~/names
移出標號不為0的目錄并不會(huì )改變工作目錄。
?8.3  參數和變量:變量在引用時(shí)一般在前面加$
在shell中,shell參數與用戶(hù)可訪(fǎng)問(wèn)的某個(gè)值相關(guān)。參數的名字由字母、數字和下劃線(xiàn)組成,常被稱(chēng)為shell變量,或者簡(jiǎn)稱(chēng)為變量。
變量名必須以字母或者下劃線(xiàn)開(kāi)頭,而不能是數字。
用戶(hù)命名并賦值的shell變量稱(chēng)為用戶(hù)創(chuàng )建的變量??梢詫⒂脩?hù)創(chuàng )建的變量變成全局變量。全局變量(又稱(chēng)為環(huán)境變量)可以被任何shell和從最初shell創(chuàng )建的其他程序訪(fǎng)問(wèn)。
這里有一個(gè)命名約定,即全局變量只使用大寫(xiě)字母,而其他變量則使用大小寫(xiě)混合命名。
$ myvar = abc       #怎樣聲明沒(méi)初始值的變量
Bourne Again Shell允許在命令行中放置變量賦值語(yǔ)句。這些賦值語(yǔ)句只是該命令shell的局部行為,也就是說(shuō)它們只適用于該命令。
$ cat my_script
echo $TEMPDIR
$ TEMPDIR=/home/sam/temp my_script
/home/sam/temp
$ echo $TEMPDIR
$
關(guān)鍵字shell變量(簡(jiǎn)稱(chēng)為關(guān)鍵字變量)對于shell而言,具有特殊的意義,它們的名字一般比較短而且有助于記憶。 Shell啟動(dòng)時(shí),將從環(huán)境中繼承幾個(gè)關(guān)鍵字變量。HOME和PATH就屬于這樣的變量。
一行命令中的每個(gè)參數都將成為位置參數的值。使用位置參數可以訪(fǎng)問(wèn)命令行參數。內置命令set可以用來(lái)對位置參數賦值。
其他經(jīng)常需要用到的shell腳本值,比如最后一次執行的命令名、命令行參數的個(gè)數以及最近執行命令的狀態(tài)等,這些值均保存在特殊參數中。用戶(hù)不能對特殊參數賦值。
?8.3.1  用戶(hù)創(chuàng )建的變量
–$ person=alex
$ echo person
person
$ echo $person
alex
由于開(kāi)頭的$,shell識別出這是一個(gè)變量的名字,并將該變量的值代入,同時(shí)將該值傳遞給echo。Echo顯示變量的值而不是它的名字
當使用變量作為參數執行一個(gè)命令的時(shí)候,shell將用該變量的值來(lái)代替變量名,并將該值傳遞給正在執行的程序。如果變量的值包含特殊字符,比如*或者?,shell可能還會(huì )擴展這個(gè)變量。
在下面的命令序列中,第1行命令將字符串a(chǎn)lex*賦值給變量memo。Bourne Again Shell在向變量賦值的時(shí)候,bash并沒(méi)有進(jìn)行路徑名擴展。在下面的echo命令行中,雙引號將$memo的展開(kāi)值中的星號(*)引起來(lái),這樣在將其值傳遞給echo命令之前,可以阻止bash對已展開(kāi)的變量memo進(jìn)行路徑名展開(kāi):
$ memo=a1ex*
$ echo "$memo"
alex*
當引用一個(gè)包含未被引號引起來(lái)的特殊字符的變量時(shí),所有shell均將這些字符解釋為特殊字符。
$ ls
alex.report
a1ex.summary
$ echo $memo
alex.report alex.summary
語(yǔ)法$VARIABLE是${ VARIABLE }的特殊情形,后者要更加通用,它將變量名用${}括起來(lái)?;ɡㄌ枌⒆兞棵綦x開(kāi)。將一個(gè)變量和一個(gè)字符串連接起來(lái)的時(shí)候,花括號是必要的:
$ PREF=counter
$ WAY=$PREFc1ockwise
$ FAKE=$PREFfeit
$ echo $WAY $FAKE
$
shell認為一個(gè)未設定值的變量為空字符串(null),為了實(shí)現這些語(yǔ)句的意圖,需要使用花括號來(lái)引用PREF變量:
$ PREF=counter
$ WAY=${PREF}c1ockwise
$ FAKE=${PREF}feit
$ echo $WAY $FAKE
counterclockwise counterfeit
Bourne Again Shell通過(guò)位置參數如$1, … $9,引用命令行中的參數。引用第9個(gè)之后的參數,就必須使用花括號:${10}。命令的名字保存在$0中。
unset:刪除變量。除非變量被刪除,否則它將伴隨著(zhù)創(chuàng )建它的shell一直存在。使用值null(在tcsh中,使用set person =)可以將變量的值刪除,但是不刪除該變量:
$ person=
$ echo $person
$
$ unset person
?8.3.2  變量屬性
?1. readonly:使變量值不可變更
如果嘗試刪除或者改變只讀變量的值,shell將顯示一條錯誤消息:
$ person=jenny
$ echo $person
jenny
$ readonly person
$ person=he1en
bash: person: readonly variable
當不帶參數使用內置命令readonly時(shí),它會(huì )列表顯示所有只讀變量。
?2. declare和typeset:為變量賦值與屬性
內置命令declare和typeset可用來(lái)設置shell變量的屬性和值。
?表8-3  變量屬性(typeset或者declare)
屬性
含義
-a
聲明一個(gè)數組變量
-f
聲明一個(gè)函數變量
-i
聲明一個(gè)整數變量
-r
聲明變量為只讀,可用readonly
-x
輸出變量(設置為全局變量),也可用export
下面的命令聲明了幾個(gè)變量并設置了一些屬性。第1行聲明可以不帶字declare。
$ declare personl=a1ex
$ declare -r person2=jenny
$ declare -rx person3=he1en
$ declare -x person4
可以以任意順序分別列出declare的選項。
$ declare -x -r person3=helen
將clare命令行中的連字符換成字符+,可以為變量刪除某個(gè)屬性。用戶(hù)不能刪除只讀屬性。怎樣刪除只讀屬性
$ declare +x person3      #person3不再為全局變量
可以用typeset代替declare
不帶任何參數和選項,命令declare將列出所有shell變量。
declare帶有選項,但是沒(méi)有變量名作為參數,那么,將列出所有具有指定屬性集合的shell變量。
默認情況下,變量的值作為字符串存放。當對某個(gè)字符串變量進(jìn)行算術(shù)運算的時(shí)候,shell將該變量轉換為一個(gè)數字,計算完之后,再將其轉換為字符串。具有整數屬性的變量將作為整數存放。下面將為變量指派整數屬性:
$ typeset -i COUNT
?8.3.3  關(guān)鍵字變量
關(guān)鍵字變量可以通過(guò)繼承而來(lái),也可以在shell啟動(dòng)時(shí)聲明并初始化??赏ㄟ^(guò)命令行方式或者在初始化文件中為這些變量指派值。
?1. HOME:用戶(hù)的主目錄
shell使用HOME的值來(lái)展開(kāi)路徑名,該路徑名使用簡(jiǎn)寫(xiě)形式(代字號~)來(lái)表示用戶(hù)的主目錄。
?2. PATH:shell查找程序的路徑
變量PATH按照順序指定了shell應該搜索的目錄。每個(gè)目錄彼此之間必須使用冒號隔開(kāi)。下面的命令設置PATH,最后,shell將在工作目錄中搜索。輸出PATH將使其值可以被子shell訪(fǎng)問(wèn):
$ export PATH=/usr/1oca1/bin:/bin:/usr/bin:~/bin:
該串中的空值表示工作目錄 (該串的最后一個(gè)元素 )
一般而言,超級用戶(hù)的PATH要完全忽略工作目錄。將工作目錄放在PATH的首位會(huì )導致安全黑洞??稍谠O置PATH新值時(shí)引用舊值
?4. PS1:用戶(hù)主提示符
變量PS1(在tcsh下是prompt)保存了shell用來(lái)提示用戶(hù)輸入命令的提示符串。當用戶(hù)修改PS1或者prompt的值時(shí),用戶(hù)的提示符就會(huì )發(fā)生改變。
$ PSl="[\u@\h \W \!]$ "
[user@host directory event]$
?5. PS2:用戶(hù)次提示符—等待完成輸入的提示符
?6. PS3:菜單提示符
PS3保存了用于select控制結構的菜單提示符。
?7. PS4:調試提示符
PS4保存了bash調試提示符。
?8. IFS:分隔輸入字段(分詞)
IFS(Internal Field Separator,內部字段分隔符)shell變量(tcsh沒(méi)有)指定了在命令行中用來(lái)分隔參數的字符,其默認值為空格符、制表符和換行符。
當為IFS指派字符值的時(shí)候,這些字符也可以分隔字段,但是只有在進(jìn)行展開(kāi)的時(shí)候才可以這樣。
$ IFS="p"
$ export VAR
盡管IFS設置為p,但是在export命令行中的p并沒(méi)有展開(kāi),因此字export并沒(méi)有分詞。
?9. CDPATH:擴大cd的范圍
使用CDPATH變量(在tcsh下為cdpath),用戶(hù)可以用一個(gè)簡(jiǎn)單的文件名作為參數傳遞給內置命令cd,就將工作目錄改變到某個(gè)目錄,而這個(gè)目錄并不是工作目錄的子目錄。
export CDPATH=$HOME:$HOME/literature
此命令使cd搜索用戶(hù)主目錄、目錄literature以及輸入cd命令時(shí)所在的工作目錄。
若希望cd首先搜索工作目錄(以root身份登錄則一定不要這樣做,請參見(jiàn)第8.3.3),那么可將空字符串作為CDPATH的第1項??兆址脙蓚€(gè)冒號(::)表示。
export CDPATH=: :$HOME: SHOME/literature
?8.3.4  特殊字符
表8-6 列出了bash 和tcsh shell 的特殊字符。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
主題 109: Shell、腳本、編程和編譯
《Linux命令行與shell腳本編程大全》使用其他shell
bash的一些內建命令
第十四章 SHELL 腳本
shell淺談之一變量和引用
linux-shell腳本基礎-2
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久