Shell語(yǔ)言學(xué)習(xí)(四)

內(nèi)容一:Shell腳本語(yǔ)言-管道

分析場(chǎng)景:有的時(shí)候我們需要一個(gè)命令的輸出作為另外一個(gè)命令輸入
    
語(yǔ)法結(jié)構(gòu):command1 | command2
         command1->相當(dāng)于你
        "|"->相當(dāng)于電話
        command2->女朋友(男朋友)

內(nèi)容二:Shell腳本語(yǔ)言-重定向

重定向目的:就是操作文件輸入和輸出
1爆惧、學(xué)習(xí)->輸入/輸出重定向->控制臺(tái)/文件
1.1 輸入重定向->語(yǔ)法

語(yǔ)法結(jié)構(gòu):wc 名稱名稱

1.1.1 "<":輸入重定向

命令代碼:wc fileA.sh    

將fileA中內(nèi)容讀取到控制臺(tái)
wc讀取到了三個(gè)重要信息
第一個(gè)參數(shù):文本行數(shù)
第二個(gè)參數(shù):文本詞數(shù)
第三個(gè)參數(shù):文本字節(jié)數(shù)
1.1.2 "<<":創(chuàng)建文件

cat命令

1.2 輸出重定向
1.2.1 ">":我們把方向指向一份文件,那么將文件中的內(nèi)容刪除仪壮,寫(xiě)入新的內(nèi)容
腳本文件fileA.sh代碼

#!/bin/bash
echo "我是文件A"

腳本文件fileB.sh代碼

#!/bin/bash
echo "我是文件B"            
echo "Hello Dream" > fileA.sh   

執(zhí)行腳本代碼
./fileB.sh
總結(jié):替換內(nèi)容->將fileB.sh輸出內(nèi)容替換了fileA.sh中內(nèi)容

1.2.2 ">>":追加

2航徙、"expr"命令深入研究
"+"、"-"、"*"捂刺、"/"等等...
方式一
腳本代碼

#!/bin/bash
a=100
b=200
val=`expr $a + $b`
echo "val值:$val"

執(zhí)行結(jié)果
Dream$ ./fileA.sh
val值:300
總結(jié)一下:其它運(yùn)算符也是一樣的用法

方式二
腳本代碼

#!/bin/bash
a=100
b=200
val=$(expr $a + $b)
echo "val值:$val"

執(zhí)行結(jié)果
Dream$ ./fileA.sh
val值:300
總結(jié)一下:其它運(yùn)算符也是一樣的用法

方式三
腳本代碼

#!/bin/bash
a=100
b=200
val=$[ $a + $b ]
echo "val值:$val"

執(zhí)行結(jié)果
Dream$ ./fileA.sh
val值:300

3、浮點(diǎn)數(shù)
3.1 bash基本用法
bash計(jì)算器->實(shí)際上是一種編程語(yǔ)言募寨,這個(gè)允許在命令中輸入浮點(diǎn)數(shù)表達(dá)式族展,然后解釋并且計(jì)算表達(dá)式,最后返回結(jié)果拔鹰。
bash計(jì)算器識(shí)別哪些類型:
1仪缸、數(shù)字:整數(shù)、浮點(diǎn)數(shù)
2列肢、變量:簡(jiǎn)單變量數(shù)組
3恰画、注釋、表達(dá)式瓷马、函數(shù)等…

3.2 案例學(xué)習(xí)
直接在命令行輸入:bc命令拴还,然后進(jìn)行計(jì)算
解釋一下bc命令:在shell腳本語(yǔ)言中提示符下通過(guò)bc命令訪問(wèn)bash計(jì)算器

第一步:輸入bc命令->打開(kāi)計(jì)算器
    命令:Dream$ bc
    輸出結(jié)果:
    bc 1.06
    Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, 

Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
第二步:開(kāi)始計(jì)算
在控制臺(tái)輸入:Dream$ 10 * 2.55

第三步:退出計(jì)算器
    輸入命令:quit命令

3.3 將bash計(jì)算器應(yīng)用到我們shell腳本語(yǔ)言中
語(yǔ)法結(jié)構(gòu):val=$(echo "options; expression" | bc)
解釋語(yǔ)法:
options表示->選項(xiàng)->可以設(shè)置精度
expression表示->表達(dá)式
案例一:基本語(yǔ)法演示

#!/bin/bash
val=$(echo " 1.56555 * 100 " | bc)
echo "val值:$val"

總結(jié)一下
1.56 * 100->稱之為->表達(dá)式expression

案例二:分析問(wèn)題->稍微復(fù)雜一點(diǎn)計(jì)算

#!/bin/bash
val1=1.314
val2=0.618
val3=$(echo " $val1 * $val2 " | bc)
val4=$(echo " $val3 * $val2 " | bc)
echo "val4結(jié)果:$val4"

總結(jié):比較簡(jiǎn)單計(jì)算沒(méi)有問(wèn)題,復(fù)雜計(jì)算很麻煩了

案例三:bc命令+輸入重定向
語(yǔ)法格式:

val=$(bc << FG
            options
            statements
            expression
            FG
        )

腳本代碼

#!/bin/bash
val1=1.314
val2=0.618
val3=100
val4=100
val=$(bc << FG
        a = ($val1 * $val2)
        b = ($val3 * $val4)
        a * b
        FG
    )
echo "val結(jié)果:$val"

4欧聘、重定向->外部文件操作片林?
4.1 理解輸入和輸出、錯(cuò)誤概念怀骤?
Shell腳本語(yǔ)言中將:輸入费封、輸出、錯(cuò)誤分為了三種描述符(3種狀態(tài))->分別對(duì)應(yīng)的值(0晒喷、1孝偎、2)
4.1.1 第一種:STDIN->標(biāo)準(zhǔn)輸入->0->鍵盤輸入

第一點(diǎn):直接輸入cat命令->接收鍵盤輸入,然后打印到控制臺(tái)
    Dream$ cat
    Dream
    Dream
    退出編輯:control+c
第二點(diǎn):采用cat接收一個(gè)非STDIN->文件輸入
    說(shuō)白了:就是讀取文件內(nèi)容凉敲,輸出到控制臺(tái)
    命令:cat fileA.sh
    結(jié)果:文件內(nèi)容

4.1.2 第二種:STDOUT->標(biāo)準(zhǔn)輸出->1->對(duì)應(yīng)終端顯示

第一點(diǎn):重定向->輸出文件中
原來(lái)是輸出到控制臺(tái)衣盾,現(xiàn)在我要重定向到文件
腳本代碼
    Dream$ ls -l fileB.sh
    Dream$ cat fileB.sh
注釋:"ls -l"顯示文件時(shí)間信息(年月日分秒格式)、權(quán)限
追加內(nèi)容
    Dream$ who >> fileB.sh
    Dream$ cat fileB.sh
注意:"who"命令打印當(dāng)前登錄系統(tǒng)用戶信息
第二點(diǎn):重定向錯(cuò)誤->輸出到文件中
    Dream$ ls -al a.sh > error.sh
注意:"-al"文件列表
總結(jié)一:到我們的命令發(fā)生錯(cuò)誤時(shí)候爷抓,shell腳本語(yǔ)言并不會(huì)將錯(cuò)誤信息重定向到輸出重定向文件势决,shell及時(shí)創(chuàng)建了輸出重定向文件,當(dāng)時(shí)也不會(huì)寫(xiě)入內(nèi)容
                    
總結(jié)二:雖然創(chuàng)建了文件蓝撇,但是文件內(nèi)容是空的
總結(jié)三:shell腳本語(yǔ)言對(duì)錯(cuò)誤信息處理和普通信息輸出是分開(kāi)的果复,那么如果我們希望報(bào)錯(cuò)錯(cuò)誤信息,那么需要采用STDERR實(shí)現(xiàn)

4.1.3 第三種:STUERR->標(biāo)準(zhǔn)錯(cuò)誤->2

5渤昌、重定向錯(cuò)誤信息
5.1 只重定向錯(cuò)誤
1虽抄、將STDERR文件描述修改為2

Dream$ ls -al a.sh 2> error.sh

2走搁、將STDOUT和STDERR結(jié)合使用

第一步:執(zhí)行命令
    Dream$ ls -al fileA.sh fileB.sh fileC.sh 2> error.sh
第二步:查看結(jié)果
    -rwxr-xr-x@ 1 Dream  staff  153 11  3 21:26 fileA.sh
    -rwxr-xr-x@ 1 Dream  staff   64 11  3 21:47 fileB.sh

5.2 重定向錯(cuò)誤和數(shù)據(jù)
1、"1>"和"2>"結(jié)合使用->深度結(jié)合
目的:報(bào)錯(cuò)錯(cuò)誤信息迈窟,同時(shí)還要報(bào)錯(cuò)數(shù)據(jù)

第一步:執(zhí)行命令
    Dream$ ls -al fileA.sh fileB.sh fileC.sh 2> error.sh 1> fileContent.sh
第二步:查看數(shù)據(jù)
    Dream$ cat fileContent.sh
    -rwxr-xr-x@ 1 Dream  staff  153 11  3 21:26 fileA.sh
    -rwxr-xr-x@ 1 Dream  staff   64 11  3 21:47 fileB.sh
第三步:查看錯(cuò)誤
    Dream$ cat error.sh
    ls: fileC.sh: No such file or directory

2私植、將數(shù)據(jù)和錯(cuò)誤信息,同時(shí)輸出到同一個(gè)文件
"&>":重定向結(jié)構(gòu)

第一步:執(zhí)行命令
    Dream$ ls -al fileA.sh fileB.sh fileC.sh &> error.sh
第二步:查看文件內(nèi)容
    Dream$ cat error.sh

6车酣、重定向輸出->深入一點(diǎn)
6.1 臨時(shí)重定向->"&"
案例一
腳本代碼->fileA.sh

#!/bin/bash
#臨時(shí)重定向
echo "Hello world" >&2
echo "你好"

執(zhí)行腳本
Dream$ ./fileA.sh
腳本結(jié)果 Hello world
你好
案例二
案例二含義:我要將fileA中標(biāo)記的錯(cuò)誤信息曲稼,全部保存到error.sh中,通過(guò)STDERR重定向到error.sh里面
腳本代碼->fileA.sh

#!/bin/bash
#臨時(shí)重定向
#一下這句話定義為錯(cuò)誤信息
echo "Hello world" >&2
echo "JAR童鞋"

執(zhí)行腳本
Dream$ ./fileA.sh 2> error.sh
6.2 永久重定向
案例一:保存數(shù)據(jù)
腳本代碼->fileA.sh

#!/bin/bash
#exec命令:批量輸出
exec 1> fileContent.sh                  
echo "Hello world"
echo "你好"
echo "JAR童鞋"

執(zhí)行腳本
Dream$ ./fileA.sh

案例二:保存錯(cuò)誤信息+保存數(shù)據(jù)
腳本代碼->fileA.sh

#!/bin/bash
#exec命令:批量輸出
exec 1> fileContent.sh                  
echo "Hello world"
echo "你好"
echo "JAR童鞋"

exec 2> error.sh
echo "我報(bào)錯(cuò)了" >&2
echo "不好意思湖员,我拒絕你贫悄,你不配"

執(zhí)行腳本
Dream$ ./fileA.sh

7、重定向輸入->深入一點(diǎn)

#!/bin/bash
#從fileContent.sh文件中讀取內(nèi)容到fileA.sh里面
exec 0< fileContent.sh                  
#循環(huán)遍歷讀取
count=1
while read line
do
    echo "當(dāng)前行數(shù):$count 讀取內(nèi)容:$line"
    count=$[ $count + 1 ]
done

執(zhí)行命令
Dream$ ./fileA.sh
注意:一旦設(shè)置了輸入重定向娘摔,那么read命令自動(dòng)鏈接文件輸入內(nèi)容

8窄坦、創(chuàng)建自己重定向
0、1晰筛、2系統(tǒng)默認(rèn)提供的嫡丙,那么我們自己可不可以自定義呢?
比如3读第、4曙博、5、6怜瞒、7父泳、8、9吴汪?
8.1 創(chuàng)建自己(自定義)輸入文件描述

案例一:創(chuàng)建新的文件或者替換內(nèi)容
腳本代碼->fileA.sh

#!/bin/bash
#exec命令:自定義文件描述符
#重定向輸出
exec 40> fileContent.sh                 
echo "Hello world"
echo "你好" >&40
echo "JAR童鞋"

執(zhí)行腳本
Dream$ ./fileA.sh

案例二:追加內(nèi)容
腳本代碼->fileA.sh
#!/bin/bash
#exec命令:自定義文件描述符
#重定向輸出
exec 40>> fileContent.sh
echo "Hello world"
echo "你好" >&40
echo "JAR童鞋"

執(zhí)行腳本
Dream$ ./fileA.sh

8.2 恢復(fù)原始文件描述符
原來(lái)是1惠窄,然后我修改為2了,這個(gè)時(shí)候我需要恢復(fù)為1漾橙?
腳本代碼->fileA.sh

#!/bin/bash
#exec命令:自定義文件描述符
#最開(kāi)始是3杆融,然后我重定向到1
exec 3>&1
exec 1> fileContent.sh      
        
echo "Hello world"
echo "你好"
echo "JAR童鞋"

#將1還原為3
exec 1>&3
echo "搞完了,完成了"

執(zhí)行腳本
Dream$ ./fileA.sh
8.3 創(chuàng)建輸入文件描述符
腳本代碼->fileA.sh

#!/bin/bash
#exec命令:自定義文件描述符
#最開(kāi)始是3霜运,然后我重定向到1
exec 6<&0
exec 0< fileContent.sh
count=1
while read line
do
    echo "當(dāng)前行數(shù):$count 讀取內(nèi)容:$line"
    count=$[ $count + 1 ]
done
#恢復(fù)之前文件描述符
exec 0<&6
read -p "你是不是一個(gè)男人脾歇?" isMan
case $isMan in
    Y|y) echo "男人" ;;
    N|n) echo "女人" ;;
    *) echo "人妖" ;;
esac

執(zhí)行腳本
Dream$ ./fileA.sh
8.3 創(chuàng)建讀寫(xiě)文件描述符
作用:一個(gè)文件即可以讀取也可以寫(xiě)入

            文件內(nèi)容->fileContent.sh
                你好
                hello
            腳本代碼->fileA.sh
                #!/bin/bash
                exec 3<> fileContent.sh
                #從fileContent.sh文件里面讀取內(nèi)容
                read line <&3
                echo "Read:$line"
                #寫(xiě)入內(nèi)容
                echo "I have a Dream" >&3

注意:替換了第二行?因?yàn)槲覀兾募羔樧x取完了第一行淘捡,文件指針指向了第二行藕各,所以第二行之后所有的內(nèi)容被替換

作業(yè)一:val=$(echo "options; expression" | bc) 設(shè)置精度?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焦除,一起剝皮案震驚了整個(gè)濱河市激况,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖乌逐,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竭讳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡黔帕,警方通過(guò)查閱死者的電腦和手機(jī)代咸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門蹈丸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)成黄,“玉大人,你說(shuō)我怎么就攤上這事逻杖》芩辏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵荸百,是天一觀的道長(zhǎng)闻伶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)够话,這世上最難降的妖魔是什么蓝翰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮女嘲,結(jié)果婚禮上畜份,老公的妹妹穿的比我還像新娘。我一直安慰自己欣尼,他們只是感情好爆雹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著愕鼓,像睡著了一般钙态。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菇晃,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天册倒,我揣著相機(jī)與錄音,去河邊找鬼磺送。 笑死驻子,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的册着。 我是一名探鬼主播拴孤,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼甲捏!你這毒婦竟也來(lái)了演熟?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芒粹,沒(méi)想到半個(gè)月后兄纺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡化漆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年估脆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片座云。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疙赠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朦拖,到底是詐尸還是另有隱情圃阳,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布璧帝,位于F島的核電站捍岳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏睬隶。R本人自食惡果不足惜锣夹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苏潜。 院中可真熱鬧银萍,春花似錦、人聲如沸窖贤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赃梧。三九已至滤蝠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間授嘀,已是汗流浹背物咳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹄皱,地道東北人览闰。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像巷折,于是被迫代替她去往敵國(guó)和親压鉴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容