日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

shell 字典_腾讯T4周末不陪对象,就为了手打这份shell编程笔记

發(fā)布時(shí)間:2024/7/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell 字典_腾讯T4周末不陪对象,就为了手打这份shell编程笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這個(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。