三锈玉、Shell語法(三)文件包含、cat义起、獲取用戶輸入拉背、printf、函數(shù)默终、重定向

一椅棺、Shell語法(一)創(chuàng)建犁罩、變量、字符串
一两疚、Shell語法(二)打印床估、數(shù)組、參數(shù)傳遞诱渤、運(yùn)算符丐巫、流程控制
三、Shell語法(三)文件包含勺美、cat递胧、獲取用戶輸入、printf赡茸、函數(shù)缎脾、重定向

1.文件包含

首先我們創(chuàng)建兩個(gè)文件fileA.sh和fileB.sh
fileA中

#!/bin/bash
echo "這里是fileA"

fileB中

#!/bin/bash
echo "這里是fileB"
  • 語法一:. fileName
    注意:點(diǎn)號(hào)(.)和文件名之間有一個(gè)空格

在fileB中添加一行,如下

#!/bin/bash
. fileA.sh
echo "這里是fileB"

控制臺(tái)調(diào)用./fileB.sh占卧,控制臺(tái)打印結(jié)果如下

這里是fileA
這里是fileB
  • 語法二:source fileName

將fileB中改為如下所示

#!/bin/bash
source fileA.sh
echo "這里是fileB"

控制臺(tái)調(diào)用./fileB.sh遗菠,控制臺(tái)打印結(jié)果如下

這里是fileA
這里是fileB
  • 語法三:./fileName

將fileB中改為如下所示

#!/bin/bash
./fileA.sh
echo "這里是fileB"

控制臺(tái)調(diào)用./fileB.sh,控制臺(tái)打印結(jié)果如下

這里是fileA
這里是fileB

2.printf命令

printf和echo的區(qū)別屉栓?
區(qū)別1:
??printf不會(huì)自動(dòng)換行
??echo會(huì)自動(dòng)換行
區(qū)別2:
??printf一般用于格式打印
??echo用于標(biāo)準(zhǔn)輸出

語法結(jié)構(gòu):
printf format-string [arguments...]
??format-string: 為格式控制字符串
??arguments: 為參數(shù)列表舷蒲。

案例:

printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
#打印結(jié)果
#姓名     性別   體重kg
#郭靖     男      66.12
#楊過     男      48.65
#郭芙     女      47.99

%s %c %d %f都是格式替代符

%-10s 指一個(gè)寬度為10個(gè)字符(-表示左對(duì)齊,沒有則表示右對(duì)齊)友多,任何字符都會(huì)被顯示在10個(gè)字符寬的字符內(nèi)牲平,如果不足則自動(dòng)以空格填充,超過也會(huì)將內(nèi)容全部顯示出來域滥。

%-4.2f 指格式化為小數(shù)纵柿,其中.2指保留2位小數(shù)。

其他案例:

# format-string為雙引號(hào)
printf "%d %s\n" 1 "abc"
# 單引號(hào)與雙引號(hào)效果一樣
printf '%d %s\n' 1 "abc"
# 沒有引號(hào)也可以輸出
printf %s abcdef
# 格式只指定了一個(gè)參數(shù)启绰,但多出的參數(shù)仍然會(huì)按照該格式輸出昂儒,format-string 被重用
#加個(gè)換行
echo
printf %s abc def
#加個(gè)換行
echo
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
# 如果沒有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"

#打印結(jié)果
#1 abc
#1 abc
#abcdef
#abcdef
#abc
#def
#a b c
#d e f
#g h i
#j
# and 0
printf的轉(zhuǎn)義序列

3.shell函數(shù)

shell中函數(shù)定義格式如下:

[ function ] funname [()]

{

    action;

    [return int;]

}

說明:

  1. 可以帶function fun() 定義栽连,也可以直接fun() 定義,不帶任何參數(shù)凉敲。
  2. 參數(shù)返回,可以顯示加:return 返回拾酝,如果不加,將以最后一條命令運(yùn)行結(jié)果卡者,作為返回值蒿囤。 return后跟數(shù)值n(0-255)
  3. 函數(shù)返回值在調(diào)用該函數(shù)后通過 $? 來獲得。
  4. 在Shell中崇决,調(diào)用函數(shù)時(shí)可以向其傳遞參數(shù)材诽。在函數(shù)體內(nèi)部底挫,通過 $n 的形式來獲取參數(shù)的值,例如脸侥,$1表示第一個(gè)參數(shù)建邓,$2表示第二個(gè)參數(shù)...
shell函數(shù)參數(shù)處理
funWithReturn(){
    echo "這個(gè)函數(shù)會(huì)對(duì)輸入的兩個(gè)數(shù)字進(jìn)行相加運(yùn)算..."
    echo "輸入第一個(gè)數(shù)字: "
    read aNum
    echo "輸入第二個(gè)數(shù)字: "
    read anotherNum
    echo "兩個(gè)數(shù)字分別為 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "輸入的兩個(gè)數(shù)字之和為 $? !"

#打印結(jié)果:
#這個(gè)函數(shù)會(huì)對(duì)輸入的兩個(gè)數(shù)字進(jìn)行相加運(yùn)算...
#輸入第一個(gè)數(shù)字:
#2
#輸入第二個(gè)數(shù)字:
#5
#兩個(gè)數(shù)字分別為 2 和 5 !
#輸入的兩個(gè)數(shù)字之和為 7 !



funWithParam(){
    echo "第一個(gè)參數(shù)為 $1 !"
    echo "第二個(gè)參數(shù)為 $2 !"
    echo "第十個(gè)參數(shù)為 $10 !"
    echo "第十個(gè)參數(shù)為 ${10} !"
    echo "第十一個(gè)參數(shù)為 ${11} !"
    echo "參數(shù)總數(shù)有 $# 個(gè)!"
    echo "作為一個(gè)字符串輸出所有參數(shù) $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

#打印結(jié)果
#第一個(gè)參數(shù)為 1 !
#第二個(gè)參數(shù)為 2 !
#第十個(gè)參數(shù)為 10 !
#第十個(gè)參數(shù)為 34 !
#第十一個(gè)參數(shù)為 73 !
#參數(shù)總數(shù)有 11 個(gè)!
#作為一個(gè)字符串輸出所有參數(shù) 1 2 3 4 5 6 7 8 9 34 73 !

4. Linux cat命令

Linux命令大全

cat 命令用于連接文件并打印到標(biāo)準(zhǔn)輸出設(shè)備上

語法格式:cat [-AbeEnstTuv] [--help] [--version] fileName

參數(shù)說明:
-n--number:由 1 開始對(duì)所有輸出的行數(shù)編號(hào)。
-b--number-nonblank:和 -n 相似湿痢,只不過對(duì)于空白行不編號(hào)涝缝。
-s--squeeze-blank:當(dāng)遇到有連續(xù)兩行以上的空白行,就代換為一行的空白行譬重。
-v--show-nonprinting:使用 ^ 和 M- 符號(hào)拒逮,除了 LFD 和 TAB 之外。
-E--show-ends : 在每行結(jié)束處顯示 $臀规。
-T--show-tabs: 將 TAB 字符顯示為 ^I滩援。
-A, --show-all:等價(jià)于 -vET。
-e:等價(jià)于"-vE"選項(xiàng)塔嬉;
-t:等價(jià)于"-vT"選項(xiàng)玩徊;

#把 file1 的文檔內(nèi)容加上行號(hào)后輸入 file2 這個(gè)文檔里:
cat -n file1 > file2

#把 file1 和 file2 的文檔內(nèi)容加上行號(hào)(空白行不加)之后將內(nèi)容附加到 file3 文檔里:
cat -b file1 file2 >> file3

#清空 /etc/test.txt 文檔內(nèi)容:
cat /dev/null > /etc/test.txt

#cat 也可以用來制作鏡像文件。例如要制作軟盤的鏡像文件谨究,將軟盤放好后輸入:
cat /dev/fd0 > OUTFILE

#相反的恩袱,如果想把 image file 寫到軟盤,輸入:
cat IMG_FILE > /dev/fd0

5.輸入/輸出重定向

一般情況下胶哲,每個(gè) Unix/Linux 命令運(yùn)行時(shí)都會(huì)打開三個(gè)文件:

  • 標(biāo)準(zhǔn)輸入文件(stdin):stdin的文件描述符為0畔塔,Unix程序默認(rèn)從stdin讀取數(shù)據(jù)。
  • 標(biāo)準(zhǔn)輸出文件(stdout):stdout 的文件描述符為1鸯屿,Unix程序默認(rèn)向stdout輸出數(shù)據(jù)澈吨。
  • 標(biāo)準(zhǔn)錯(cuò)誤文件(stderr):stderr的文件描述符為2,Unix程序會(huì)向stderr流中寫入錯(cuò)誤信息寄摆。

默認(rèn)情況下谅辣,command > file 將 stdout 重定向到 file,command < file 將stdin 重定向到 file婶恼。

重定向命令列表如下


重定向命令列表

更多的重定向可以查看:Shell 輸入/輸出重定向

輸入重定向

標(biāo)準(zhǔn)情況下桑阶,我們從默認(rèn)從stdin讀取數(shù)據(jù)獲得輸入,輸入重定向命令后,我們將從文件獲取輸入
語法:command < fileName
這樣勾邦,本來需要從鍵盤獲取輸入的命令會(huì)轉(zhuǎn)移到文件讀取內(nèi)容联逻。

  • 注意:輸出重定向是大于號(hào)>,輸出重定向是小于號(hào)<

案例1:讀取fileA的數(shù)據(jù)

#我們從fileA中讀取數(shù)據(jù),在控制臺(tái)輸入
wc < fileA.sh
#輸出:      44     140    1147

wc讀取打了三個(gè)重要信息:
第一個(gè)參數(shù):文本行數(shù)
第二個(gè)參數(shù):文本詞數(shù)
第三個(gè)參數(shù):文本字節(jié)數(shù)

案例2:讀取fileA的行數(shù)和文件名

#我們從fileA中讀取數(shù)據(jù)检痰,在控制臺(tái)輸入
wc -l fileA.sh
#輸出:      44 fileA.sh

案例3:讀取fileA的行數(shù)

#我們從fileA中讀取數(shù)據(jù),在控制臺(tái)輸入
 wc -l < fileA.sh
#輸出:      44

注意:案例2和案例3的結(jié)果不同锨推,案例2會(huì)輸出文件名铅歼;案例3不會(huì)公壤,因?yàn)樗鼉H僅知道從標(biāo)準(zhǔn)輸入讀取內(nèi)容

案例4:我們創(chuàng)建一個(gè)空的fileB.sh

#在控制臺(tái)輸入
wc < fileA.sh > fileB.sh
cat fileB.sh
#輸出:      44     140    1147

案例4的意思是,從文件fileA.sh中讀取數(shù)據(jù)椎椰,然后將輸出寫入到fileB.sh中

輸出重定向

命令格式:command > fileName
注釋:我們把方向指向一份文件厦幅,那么將文件中的內(nèi)容刪除,寫入新的內(nèi)容

案例1

#在控制臺(tái)輸入
echo "hello" > fileB.sh
cat fileB.sh
#輸出:hello

案例2:

#在控制臺(tái)依次輸入
who > fileB.sh
cat fileB.sh
#輸出:
#David console  May 30 12:48 
#David ttys000  May 30 15:45 

案例3:

#在控制臺(tái)依次輸入
who > fileB.sh
echo "這是追加的" >> fileB.sh
cat fileB.sh
#打印結(jié)果
#David console  May 30 12:48 
#David ttys000  May 30 15:45 
#這是追加的

輸出重定向總結(jié):

  1. 輸出重定向會(huì)覆蓋文件內(nèi)容
  2. 如果不希望文件內(nèi)容被覆蓋慨飘,可以使用>>追加到文件末尾
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末确憨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瓤的,更是在濱河造成了極大的恐慌休弃,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圈膏,死亡現(xiàn)場離奇詭異塔猾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)稽坤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門丈甸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尿褪,你說我怎么就攤上這事睦擂。” “怎么了杖玲?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵顿仇,是天一觀的道長。 經(jīng)常有香客問我天揖,道長夺欲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任今膊,我火速辦了婚禮些阅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斑唬。我一直安慰自己市埋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布恕刘。 她就那樣靜靜地躺著缤谎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褐着。 梳的紋絲不亂的頭發(fā)上坷澡,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音含蓉,去河邊找鬼频敛。 笑死项郊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斟赚。 我是一名探鬼主播着降,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拗军!你這毒婦竟也來了任洞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤发侵,失蹤者是張志新(化名)和其女友劉穎交掏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體器紧,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耀销,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铲汪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熊尉。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖掌腰,靈堂內(nèi)的尸體忽然破棺而出狰住,到底是詐尸還是另有隱情,我是刑警寧澤齿梁,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布催植,位于F島的核電站,受9級(jí)特大地震影響勺择,放射性物質(zhì)發(fā)生泄漏创南。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一省核、第九天 我趴在偏房一處隱蔽的房頂上張望稿辙。 院中可真熱鬧,春花似錦气忠、人聲如沸邻储。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吨娜。三九已至,卻和暖如春淘钟,著一層夾襖步出監(jiān)牢的瞬間宦赠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袱瓮,地道東北人缤骨。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像尺借,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子精拟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355