一椅棺、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
3.shell函數(shù)
shell中函數(shù)定義格式如下:
[ function ] funname [()]
{
action;
[return int;]
}
說明:
- 可以帶function fun() 定義栽连,也可以直接fun() 定義,不帶任何參數(shù)凉敲。
- 參數(shù)返回,可以顯示加:return 返回拾酝,如果不加,將以最后一條命令運(yùn)行結(jié)果卡者,作為返回值蒿囤。 return后跟數(shù)值n(0-255)
- 函數(shù)返回值在調(diào)用該函數(shù)后通過 $? 來獲得。
- 在Shell中崇决,調(diào)用函數(shù)時(shí)可以向其傳遞參數(shù)材诽。在函數(shù)體內(nèi)部底挫,通過 $n 的形式來獲取參數(shù)的值,例如脸侥,$1表示第一個(gè)參數(shù)建邓,$2表示第二個(gè)參數(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命令
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é):
- 輸出重定向會(huì)覆蓋文件內(nèi)容
- 如果不希望文件內(nèi)容被覆蓋慨飘,可以使用>>追加到文件末尾