shell 字典_腾讯T4周末不陪对象,就为了手打这份shell编程笔记
這個(gè)周末,為了某些原因,我把shell編程的一些基礎(chǔ)知識(shí)進(jìn)行了相應(yīng)的整理,這里分享給大家,大家在看的時(shí)候,有什么問(wèn)題可以在下方評(píng)論區(qū)給我留言呀,歡迎轉(zhuǎn)發(fā)
自己純手打,原創(chuàng)不易,謝謝支持
*基礎(chǔ)引入*
執(zhí)行sh01.sh
*文件流和重定向*
文件流:我們大家應(yīng)該對(duì)一個(gè)東西不陌生,編程,那編程這個(gè)東西簡(jiǎn)化一下應(yīng)該怎么分步驟呢?趙本山老師說(shuō)過(guò),是不是大象關(guān)進(jìn)冰箱分幾步 啊,三步是不是,打開(kāi)冰箱,大象放進(jìn)去,關(guān)上冰箱,那好,其實(shí)我們的編程也就是這樣,無(wú)非就是一個(gè)input一個(gè)output,中間的實(shí)現(xiàn)過(guò)程是不是就可以按照你的習(xí)慣自己去書寫了啊,對(duì)吧,所以文件流或者說(shuō)IO流其實(shí)就是這樣的一個(gè)概念
那好,我們?yōu)槭裁匆趌inux中強(qiáng)調(diào)這個(gè)東西,你們之前學(xué)過(guò)linux,那你們應(yīng)該知道linux區(qū)別于windows 的一個(gè)點(diǎn)是不是就是文件至上 啊,在linux的認(rèn)知中的,一切皆文件,可能你們用的是圖形化界面的linux,那大家可以看一下老師的這一個(gè),是不是里面所有的東西都是文件啊,就是以文件的形式存在的。
重定向:(重定向不是命令)
程序自身都有IO
0:標(biāo)準(zhǔn)輸入
1:標(biāo)準(zhǔn)輸出
2:錯(cuò)誤輸出
輸出重定向
控制程序IO位置:本身我們的文件是不是一對(duì)一的,一一對(duì)應(yīng),一個(gè)輸入就是完整的輸入到一個(gè)輸出中啊,然后呢,我們linux干了一件什么事 啊,他找了一個(gè)第三者(fd),中間人的意思啊,然后呢,我們的輸入連接到第三者,然后由第三者將數(shù)據(jù)進(jìn)行相應(yīng)的轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)到我們想要他去的位置
cd /prof/$$/fd
Ps -ef 查看進(jìn)程 ps -ef | grep 13175
舉個(gè)例子,ls這個(gè)命令大家都很熟悉了對(duì)吧,我反正拿到一個(gè)linux系統(tǒng),就跟拿到數(shù)據(jù)庫(kù)管他怎么樣,先來(lái)一個(gè)select一樣,我就先來(lái)一個(gè)ls,然后再去做別的,那好,那我們知道,ls是不是就是輸出顯示啊,ll命令就是ls -l的縮寫,那他是將當(dāng)前目錄的內(nèi)容展現(xiàn)到控制臺(tái)也就是我們的頁(yè)面上進(jìn)行相應(yīng)的顯示,對(duì)不對(duì),那好,我們前面也說(shuō)過(guò)012這三個(gè)屬性對(duì)吧,對(duì)應(yīng)輸出的是不是就是我們的1啊,那我們可不可以通過(guò)1這個(gè)屬性將我們的這個(gè)輸出位置進(jìn)行相應(yīng)的改變啊,好,我們來(lái)看一下
ls 1> aaa 在這其中有兩個(gè)點(diǎn),
一個(gè)是覆蓋(ls /tmp 1> aaa)
一個(gè)是追加(ls /tmp 1>>aaa)
那如果我們換一下呢 ls / /tmp 1> aaa 這個(gè)命令是不是這兩個(gè)文件夾中的目錄都進(jìn)入我的aaa中了啊,那他的順序是怎么樣的啊,那好,這個(gè)地方分成兩種情況討論,
一同級(jí)(按照字典序排列),
而上下級(jí)(按照上下級(jí)排列,也就是我們的目錄深度,為什么,因?yàn)槲覀兊膌inux是不是一個(gè)目錄樹(shù)的結(jié)構(gòu) 啊 tree -L n)
組合使用
新建 mkdir out
ls / /aabb 1>ls01.out 2>ls02.out(aabb不存在)
那這樣寫是不是很麻煩啊,可以不可以聯(lián)系結(jié)合到一起啊
ls / /aabb 1>ls03.out 2>ls03.out
按照常理來(lái)說(shuō)是不是從左向右執(zhí)行,對(duì)吧,但是這里為什么沒(méi)有我們的錯(cuò)誤輸出呢?好,我們來(lái)看一下
ls / /aabb 或者ls /aabb /
我們發(fā)現(xiàn),無(wú)論怎么處理,是不是最先輸出的是我們的錯(cuò)誤日志啊,那也就是說(shuō),我的命令
ls / /aabb 1>ls03.out 2>ls03.out
先將錯(cuò)誤日志寫入到ls03.out中啊,然后當(dāng)我們?cè)俅螌懭霕?biāo)準(zhǔn)輸出的時(shí)候,會(huì)被覆蓋掉啊,
ls / /aabb 1>>ls04.out 2>>ls04.out
這樣是不是還是很麻煩啊,人比較懶,我不想重寫兩遍,那我該怎么處理呢?
這里就有一個(gè)新的符號(hào)&
ls / /aabb 2>&1 1>ls05.out
這里有問(wèn)題啊,是不是啪啪打臉 啊,我說(shuō)這里可以用一個(gè)&符號(hào),但是為什么會(huì)有問(wèn)題啊?
大家想一下這條命令,我是不是按照順序進(jìn)行,是不是有一個(gè)2,一個(gè)1 啊,那2指向1了,但是1是不是指向控制臺(tái)啊,也就是說(shuō)我的錯(cuò)誤日志是不是還是在控制臺(tái)上進(jìn)行展示啊,然后這個(gè)進(jìn)行完了之后,1又重新指向了ls05.out,那我們這地方考慮一下,換個(gè)順序怎么樣?
ls / /aabb 1>ls06.out 2>&1
這樣是不是就可以了啊。但是啊,這里注意啊(符號(hào)左邊不能有空格,,但是右邊沒(méi)問(wèn)題,是可以的)
ls / /aabb >& ls07.out 和ls / /aabb >& ls07.out這是兩個(gè)特殊寫法 是最簡(jiǎn)單的特殊寫法,記住就可以了)
輸入重定向
之前我們寫的都是輸出重定向,然后接下來(lái)就是我們的輸入重定向
read aaa <<< "hello world"
read aaa<
cat 0
*shell變量*
exec ls---展示當(dāng)前目錄并退出
exec 8<> /dev/tcp/www.baidu.com/80
[root@linuxStudy fd]# echo -e "GET / HTTP/1.0" 1>&8
[root@linuxStudy fd]# cat 0
注意點(diǎn):我們剛才是不是echo發(fā)送了一個(gè)數(shù)據(jù)啊,但是我們?cè)俅蝐at的時(shí)候他不會(huì)發(fā)送消息了,為什么,因?yàn)槲覀冇玫氖莌ttp1.0的版本,它是一個(gè)只會(huì)發(fā)送一次請(qǐng)求的短連接,我們?nèi)绻俅潍@取數(shù)據(jù)的話需要再次重新定義,那我們創(chuàng)建了這么多的鏈接我們?cè)撊绾蝿h除啊,可以rm -rf嗎?不行,我們只能exit退出,沒(méi)辦法,他就是這么任性
變量
那好,我們現(xiàn)在要來(lái)定義變量
本地:
當(dāng)前shell擁有,生命周期隨shell進(jìn)行改變
假設(shè)我們定義一個(gè)變量aaa=bawei
Echo $aaa 是不是可以展現(xiàn)啊,
但是如果我重新開(kāi)一個(gè)鏈接,是不是就不行了啊
如果是創(chuàng)建本地函數(shù)呢,同樣的clear
qwe沒(méi)有輸出值,為啥 啊,是不是我們就沒(méi)有給他賦值 啊,然后呢qwe=123,我給他賦值,然后我們?cè)谑褂胋awei看一下是不是就有了 啊
局部:
這一個(gè)我們的區(qū)別就是我們直接bawei可以取得bbb的值,但是我們直接echo $bbb,就不能獲取我們的值
位置
但是Vi sh03.sh
Source sh03.sh a b c d e f g h 執(zhí)行的話沒(méi)有辦法執(zhí)行啊,怎么辦呢,這個(gè)地方,當(dāng)發(fā)生重復(fù)的時(shí)候,我們可以將其括起來(lái)echo ${12}
Abc=hello
Echo $abcverygood(不行)======>echo ${abc}verygood
awk -F':' '{print $1}' passwd
這個(gè)地方的注意點(diǎn)就是這個(gè){}需不需要單引號(hào),當(dāng)我們要將其傳給bash的話不需要單引號(hào),傳給命令的話需要單引號(hào)
再說(shuō)一個(gè)簡(jiǎn)單的例子----數(shù)組
[root@linuxStudy sh]# msb=(1,2,3)
[root@linuxStudy sh]# echo $msb
1,2,3
[root@linuxStudy sh]# echo ${msb[1]}
[root@linuxStudy sh]# echo $msb[1]
1,2,3[1]
我們除了可以讀取整個(gè)數(shù)組之外,是不是無(wú)法根據(jù)下標(biāo)來(lái)進(jìn)行讀取啊,那這個(gè)地方怎么辦啊,這里就涉及到一個(gè)東西,就到分隔符,我們看一下,剛才我們定義的數(shù)組是不是通過(guò)逗號(hào)進(jìn)行分割的啊,但是linux中,他對(duì)于分隔符比較敏感的是不是空格啊,那我們用空格嘗試一下
[root@linuxStudy sh]# msb=(1 2 3)
[root@linuxStudy sh]# echo ${msb[1]}
2
特殊
$BASHPID
執(zhí)行source sh03.sh a b c d e f g h i j k l m n
$* 與 $@ 區(qū)別:
·
相同點(diǎn):都是引用所有參數(shù)。
·
·
不同點(diǎn):只有在雙引號(hào)中體現(xiàn)出來(lái)。假設(shè)在腳本運(yùn)行時(shí)寫了三個(gè)參數(shù) 1、2、3,,則 " * " 等價(jià)于 "1 2 3"(傳遞了一個(gè)參數(shù)),而 "@" 等價(jià)于 "1" "2" "3"(傳遞了三個(gè)參數(shù))。
·
注意點(diǎn):管道
[root@linuxStudy sh]# a=9
[root@linuxStudy sh]# a=22 | echo grep
grep
[root@linuxStudy sh]# echo $a
9
為什么呢?我們不是設(shè)置了a=22 啊,為什么還是現(xiàn)實(shí)為9 啊,這就是管道 的一個(gè)原理
管道就是把左邊命令的輸出作為右邊命令的輸入,這是他最基礎(chǔ)的認(rèn)知 ,那這邊,我們的bash和管道是干嘛了呢,他是在左邊和右邊各啟動(dòng)一個(gè)bash,當(dāng)左邊的bash執(zhí)行完畢后,是不是去執(zhí)行右邊的bash 啊 ,但是我們說(shuō)了,變量的值是不是執(zhí)行當(dāng)前的shell的生命周期啊,對(duì)吧,那這樣的話當(dāng)這個(gè)bash結(jié)束之后是不是他的生命周期就結(jié)束了 啊,那他跟我們外面的這個(gè)bash有影響嗎?沒(méi)有的,那這個(gè)地方有什么用處呢?
這個(gè)就是我們的環(huán)境變量的問(wèn)題?
環(huán)境
我們之前用過(guò)jdk吧,那我們知道jdk配置完成之后要在環(huán)境變量中定義
那這個(gè)地方就涉及到一個(gè)問(wèn)題,就是bash是如何創(chuàng)建的,bash在管道中的創(chuàng)建,子bash會(huì)繼承父bash的值,但是在其他里面就不可以了
但是在其他的里面呢,
這里是不是就看出來(lái)了,在管道中,是不是無(wú)論是否export,我的數(shù)值都是可以調(diào)用的啊,因?yàn)樗苯永^承父bash的值,但是呢,當(dāng)我們將其寫入到文件中的時(shí)候,如果沒(méi)有export,是不是沒(méi)有辦法找到 啊,因?yàn)樗麩o(wú)法繼承父bash,而且,這里是不能跨bash進(jìn)行繼承,例如我們?cè)趧?chuàng)建一個(gè)連接就無(wú)法調(diào)用我這個(gè)bash的值
*邏輯判斷*
我們剛才講過(guò)一個(gè)export,那好,這里再講解一下
[root@linuxStudy sh]# vi sh05.sh
[root@linuxStudy sh]# chmod +x sh05.sh
[root@linuxStudy sh]# ls
a.out passwd sh01.sh sh02.sh sh04.sh sh05.sh
[root@linuxStudy sh]# ./sh05.sh
.............
99
[root@linuxStudy sh]# a=88
[root@linuxStudy sh]# ./sh05.sh
.............
99
[root@linuxStudy sh]# export a
[root@linuxStudy sh]# ./sh05.sh
88
.............
99
export的一個(gè)特性,叫做導(dǎo)出非共享,
[root@linuxStudy sh]# echo $a
88
fork():創(chuàng)建子進(jìn)程,一個(gè)是管道(創(chuàng)建子進(jìn)程完整復(fù)制了父進(jìn)程的值,可以直接訪問(wèn)),一個(gè)是文件(需要export,如果不export的話,無(wú)法獲取父的值),
Copy on Write
引用和命令替換
單引號(hào):強(qiáng)制引用
雙引號(hào):弱引用,不會(huì)產(chǎn)生覆蓋
[root@linuxStudy sh]# a=99
[root@linuxStudy sh]# echo "$a"
99
[root@linuxStudy sh]# echo '$a'
$a
花括號(hào)擴(kuò)展不會(huì)被引用
[root@linuxStudy sh]# cp /etc/inittab /etc/passwd ./
cp:是否覆蓋"./passwd"? y
[root@linuxStudy sh]# cp /etc/{inittab,passwd} ./
cp:是否覆蓋"./inittab"? y
cp:是否覆蓋"./passwd"? y
[root@linuxStudy sh]# cp "/etc/{inittab,passwd}" ./
cp: 無(wú)法獲取"/etc/{inittab,passwd}" 的文件狀態(tài)(stat): 沒(méi)有那
個(gè)文件或目錄
為什么呢?因?yàn)閧}外如果添加引用符號(hào),他會(huì)默認(rèn)的將引號(hào)之中的路徑當(dāng)做一個(gè)文件,這是肯定不行的
Bash執(zhí)行前刪除引用以及反向引用
退出狀態(tài)和邏輯判斷
退出狀態(tài)就是我之前寫的echo $?
邏輯判斷 && (一假全假)||(一真全真 )
*表達(dá)式:*
Let命令:算術(shù)表達(dá)式
主要使用Let c=$a+$b和C=$(($a +$b))(注:可以不加$)
條件表達(dá)式
Test
簡(jiǎn)化的條件表達(dá)式
[]
*接下來(lái)我們要開(kāi)始書寫shell腳本*
1、
2、判斷是否有參數(shù)
[ ! $# -eq 1 ] && echo "args error!!!" && exit 2
3、判斷用戶是否存在
id $1 >&/dev/null && echo "user exist" && exit 3
為什么啊。因?yàn)閕d這個(gè)命令大家可以看一下 id 用戶名 可以進(jìn)行相應(yīng)的查看
4、
`#! /bin/bash`
[ ! $# -eq 1 ] && echo "args error!!!" && exit 2
id $1 >&/dev/null && echo "user exist" && exit 3
useradd $1 >&/dev/null && echo $1 | passwd --stdin $1 >&/dev/null && echo "user add success" && exit 4
echo "i don't know ,user add fail" && exit 5
*流程控制*
If
Help if.查看幫助文檔
If test 3 -gt 2; then echo ok ;fi
If test 3 -gt 2;then echo ok;else echo error ;fi
If test 3 -eq 4;then echo ok;elif test 3 -eq 3 ;then echo 3;fi
While
While ls /share;
do
echo ok;
rm -rf /share;
done
注:while后面必須跟一個(gè)命令
For
那說(shuō)起for來(lái),我們大家應(yīng)該都不陌生,它有兩種不同的方案,是不是普通的for循環(huán)和增強(qiáng)for循環(huán)啊
For((a=1;a<=5;a++));do echo $a;done
For i in 1 2 3 4 5 ;do echo $i;((i++));done
這里面補(bǔ)充一個(gè)簡(jiǎn)單的seq n它就是打開(kāi)一個(gè)n個(gè)數(shù)列的循環(huán)
相應(yīng)的內(nèi)容我已經(jīng)整理成文檔,有需要的文檔,可以私信“資料”查看獲取方式
總結(jié)
以上是生活随笔為你收集整理的shell 字典_腾讯T4周末不陪对象,就为了手打这份shell编程笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: glibc版本查看_Linux开发必知内
- 下一篇: JAVA进阶教学之(Object类的to