內(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è)置精度?