最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【筆記】BV1x7411H7wa P2

2022-12-13 15:45 作者:渚_花  | 我要投稿

筆記整理自BV1x7411H7wa P2


前注: shell 的語法可能和很多編程語言不同,所以最好不要帶著其余編程語言的想法去帶入 shell 語言中


shell中,可以通過diff命令判斷兩個(gè)文件是否相同

---

你可以在shell里面定義一個(gè)變量, 如下

上面的例子,給變量foo賦值為bar,然后使用 $foo 來訪問 foo 的值。


你需要理解的一個(gè)地方是,在處理bash的時(shí)候,空格非常關(guān)鍵,因?yàn)榭崭袷怯糜诜指魠?shù)而被保留的

例如不可以像下面這樣。


是因?yàn)閒oo命令不起作用, foo命令不存在。剛剛發(fā)生的是,嘗試調(diào)用foo程序, 第一個(gè)參數(shù)是"=",第二個(gè)參數(shù)是 bar

如果要處理名字帶有空格的文件,需要注意這一點(diǎn)。在處理字符串的時(shí)候需要小心

定義字符串有兩種方法。你可以使用雙引號(hào)定義字符串,也可以使用單引號(hào)定義字符串

對(duì)于文字字符串,單引號(hào)和雙引號(hào)等效,但是其余情況不一樣

雙引號(hào)中,變量會(huì)被代換為外殼程序中foo變量的值,而單引號(hào)不會(huì)如此

這就是引用變量的方式

一個(gè)重要的事情是你在shell中可以定義函數(shù)

我們可以訪問我在此處定義的函數(shù),例如視頻示例中,當(dāng)前目錄下的 mcd.sh文件內(nèi)容如下

在這里,如果我們調(diào)用mcd函數(shù), 先會(huì)調(diào)用mkdir命令。在這里 $1像一個(gè)特殊變量。在其余編程語言中,可能是數(shù)組argv的第一個(gè)元素表示第一個(gè)變量,而在bash里面用$1表示。

注: mkdir ,如果在當(dāng)前目錄已經(jīng)存在一個(gè)目錄的名字與將要?jiǎng)?chuàng)建的目錄名字相同, 會(huì)打印 cannot create directory。但是如果加上-p參數(shù)的話,如果已有同名目錄, 并不會(huì)返回錯(cuò)誤

在這里,我們會(huì)創(chuàng)建一個(gè)文件夾,然后用cd切換到該文件夾。

事實(shí)上,我們直接將這個(gè)文件的代碼鍵入到shell中,它將起作用,并且定義此函數(shù)。但是有時(shí)候最好在文件中寫入內(nèi)容。

這樣就可以在shell中執(zhí)行腳本并加載它。雖然現(xiàn)在看起來好像什么都沒發(fā)生,但是mcd函數(shù)已經(jīng)在shell中定義了。我們?nèi)缓罂梢詧?zhí)行 mcd test ,然后目錄轉(zhuǎn)換到了 /test 目錄下

保留命令(reserved command)除了 $1 以外, 還有更多保留命令,比如 $0 是腳本的名字, $2到$9是第二個(gè)到第九個(gè)參數(shù)。?

后面這些保留命令可以直接在shell中使用, 例如 $? 從上一條命令獲取錯(cuò)誤代碼。 \$\_ 可以獲得上一個(gè)命令的最后一個(gè)參數(shù)

另一個(gè)經(jīng)常使用的命名是 !! ,效果如下所示

進(jìn)程(process)可以通過不同的方式與其余進(jìn)程和命令交流。交流方式除了標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出以外,還有標(biāo)準(zhǔn)錯(cuò)誤流和錯(cuò)誤碼等。

因?yàn)閑cho "Hello" 沒有出現(xiàn)任何問題,所以返回0。C語言通過返回0來表示一切正常,沒有錯(cuò)誤。

下面的示例中, grep 并沒有正常運(yùn)行

這是因?yàn)槲覀儑L試搜索mcd.sh中的字符串,而字符串不存在,所以grep不打印任何東西,并且返回一個(gè)1 錯(cuò)誤代碼(error code, errno)。

有一些有趣的命令,例如命令true始終返回0 ,而false始終返回一個(gè)錯(cuò)誤代碼

可以使用邏輯運(yùn)算符(logical operators)來實(shí)現(xiàn)條件語句

邏輯或運(yùn)算符與邏輯與運(yùn)算符具有短路特性

邏輯或運(yùn)算符 || 會(huì)嘗試執(zhí)行第一個(gè)語句,如果第一個(gè)不起作用(即返回false),則執(zhí)行第二個(gè),否則不執(zhí)行第二個(gè)

邏輯與運(yùn)算符 && 會(huì)嘗試執(zhí)行第一個(gè)語句,如果第一個(gè)起作用,則第二個(gè)會(huì)被短路(short-circuited),不會(huì)被打印

還有一個(gè)是,在同一行可以使用分號(hào)命令

你可以將命令的輸出轉(zhuǎn)換為變量。這里所做的是,獲取pwd命令的(標(biāo)準(zhǔn)輸出流的)輸出, 將其儲(chǔ)存到foo變量中

更籠統(tǒng)的說, 我們可以做被稱為命令替換(command substitution)的東西。

上面的示例只是將輸出作為字符串?dāng)U展。

另一個(gè)鮮為人知的工具稱為流程替換(process substitution)。

?11:42

這個(gè)命令要做的是, 執(zhí)行命令 ls ,將輸出發(fā)送到一個(gè),相當(dāng)于臨時(shí)文件的地方, shell 為ls和cat提供這個(gè)文件的句柄。第一個(gè) ls 輸出當(dāng)前目錄,輸出結(jié)果放到這個(gè)臨時(shí)文件中, 第二個(gè) ls 輸出父目錄,將輸出結(jié)果放到同一個(gè)臨時(shí)文件。 cat 將兩個(gè)輸出結(jié)果串聯(lián)在一起輸出。


#下面是example.sh的文件內(nèi)容


date命令僅顯示當(dāng)前日期。

$0 表示當(dāng)前運(yùn)行的腳本的名字

$# 表示提供的參數(shù)數(shù)量

\$\$ 此指令的pid

$@ 拓展到所有參數(shù)


?for file in "$@" ,每次循環(huán)時(shí), file 會(huì)按順序表示 $@ 的每個(gè)參數(shù)。

在下一行, 我們運(yùn)行 grep 命令,會(huì)在file文件中搜索 foobar。 如果我們關(guān)心程序的輸出,我們可以將其重定向到某個(gè)文件, 以保存它或?qū)⑵溥B接到其他文件。但這里我們可以實(shí)際上放棄輸出,所以我們將輸出重定向到 /dev/null 上。這個(gè)有點(diǎn)像unix中的特殊設(shè)備,無論寫入多少到這里,都會(huì)被丟棄。

2> 這是用來重定向標(biāo)準(zhǔn)錯(cuò)誤流(stderr)的。這兩個(gè)流是分開的,你必須告訴bash如何處理每一個(gè)。

if 行,是用來檢驗(yàn)grep的輸出的。 -ne 是比較符,表示不相等。 其余編程語言使用"\=\=""!="等表示不相等。如果這個(gè)文件沒有 foobar 內(nèi)容,則在文件的末尾加入 \# foobar 內(nèi)容。

在bash中,有保留的比較運(yùn)算符,可以輸入以下命令查看。

我們嘗試運(yùn)行上面的腳本

然后查看 mcd.sh 的內(nèi)容

可以發(fā)現(xiàn), mcd.sh 后面插入了 foobar 內(nèi)容

在執(zhí)行腳本的另一件事是, 如果我們想獲得所有 .sh 腳本,可以使用 ls \*.sh 這樣的指令

這樣,我們可以得到 example.sh 和 mcd.sh


\* 星號(hào)可以擴(kuò)展為一個(gè)或多個(gè)字符

? 問號(hào)只會(huì)擴(kuò)展為一個(gè)字符


常用的方式是使用花括號(hào)

例如,我們想將一個(gè).png格式的圖片轉(zhuǎn)為jpg格式

下面的一行會(huì)被展開為上面的一行。

再比如, 下面的第一行命令會(huì)被展開為第二行命令

再比如,

這里會(huì)像做笛卡爾乘積一樣兩次擴(kuò)展, 會(huì)被擴(kuò)展到6個(gè)文件


你也可以將星號(hào)和大括號(hào)括起來

這樣會(huì)擴(kuò)展到 foo/a foo/b 一直到foo/j, bar也是如此。

我們這里想比較 兩個(gè) ls 輸入結(jié)果的差別


現(xiàn)在,我們只看到了bash版本, 很多時(shí)候, 對(duì)于有些腳本, bash可能不是最好的方法。你可以寫腳本與很多實(shí)現(xiàn)的shell交互。比如下面的示例

首先導(dǎo)入庫sys, 這里的sys.argv 有點(diǎn)類似于bash中得到的$0 $1 等,像參數(shù)的變量一樣。

第一行的內(nèi)容叫做 shebang , shell通過這個(gè)東西知道如何執(zhí)行命令

例如上面, shell已經(jīng)知道了如何執(zhí)行腳本,所以不需要腳本的第一行。但是如果按照下面的內(nèi)容執(zhí)行的話,腳本的第一行就會(huì)起作用了。

如果機(jī)器可能將python安裝到了上面示例以外的地方,而你想把同樣的代碼執(zhí)行在同樣的地方的話,可以使用env指令。這樣就可以使用路徑環(huán)境變量(path environment variable)搜索python的二進(jìn)制文件,用于執(zhí)行此腳本。

可以使用shellcheck工具來檢查bash腳本的錯(cuò)誤

在shell內(nèi)定義變量,或在shell加載bash腳本,可能會(huì)有一些副作用。


下面的內(nèi)容將討論一些好用的工具,第一個(gè)是 man。 當(dāng)你想知道某個(gè)標(biāo)志(flag)或命令用途,比如下面的flag, -i 的用途時(shí), 可以使用man來查看文檔。

但是,使用man指令查看文檔,有時(shí)可能會(huì)沒有示例。有些文檔可能過長或冗雜,例如指令convert和ffmpeg的文檔

可以安裝tldr工具來查看文檔,這個(gè)工具的文檔有很多示例。

下面介紹如何尋找文件。如果我們想查找所有名為src的文件, 可以使用find指令。 下面的示例,我們想找一個(gè)名為src,類型為目錄(directory)的文件

查找有很多有用的標(biāo)志(flag)。例如,-path可以匹配指定路徑

你可以查看修改時(shí)間在指定時(shí)間內(nèi)的文件,例如下面的示例會(huì)尋找當(dāng)前目錄下所有修改日期在一天內(nèi)(24小時(shí)內(nèi))的文件



下面的命令會(huì)尋找所有格式為 .tmp 的文件,并刪除。echo $? 返回0 ,表示find命令返回0, 即執(zhí)行成功。

有一個(gè)較短的命令fd, 可以使用正則表達(dá)式并忽略gitfile。它們將使用顏色代碼,具有更好的Unicode支持。

locate命令使用數(shù)據(jù)庫來搜索文件。提前將目錄存儲(chǔ)在數(shù)據(jù)庫中,執(zhí)行l(wèi)ocate命令時(shí)從數(shù)據(jù)庫中搜索文件。


更新locate命令的數(shù)據(jù)庫可以使用下面的命令

有時(shí)你可能更加關(guān)心文件的內(nèi)容,這是可以使用grep命令。如果要再次遞歸搜索當(dāng)前內(nèi)容,可以使用前面提到的find --exec,也可以使用-R 標(biāo)志。

你可以使用rg命令快速搜索。下面命令將會(huì)在 ~/scratch 目錄下在 py 類型文件中搜索 import requests 內(nèi)容。

也可以使用 ripgrep, 這個(gè)命令支持更精美的頁面和Unicode。 下面的命令在上面的命令的基礎(chǔ)上,支持顯示代碼內(nèi)容10行上下文

下面的示例中, -u 表示不要忽略隱藏文件, --files-without-match表示打印所有不符合模式的內(nèi)容, "^#\\!"是一個(gè)小的正則表達(dá)式, 表示在一行的開頭,有一個(gè)\#和一個(gè)\!。前面的內(nèi)容意思是說,搜索所有內(nèi)容中不包括 \#\! 的內(nèi)容。然后 -t sh 表示僅從 sh 文件搜索?

我們可以加入 --stats 標(biāo)志,這樣指令會(huì)在最后輸出關(guān)于此次運(yùn)行的統(tǒng)計(jì)信息。

ack 命令是原有的 grep 命令的替代品,ag也是如此。這些命令幾乎可以互換


你可以使用鍵盤上的上箭頭慢慢瀏覽之前執(zhí)行過的指令。bash提供了history命令,可以打印你的歷史記錄

history -l 可以打印所有內(nèi)容

如果想獲得有關(guān)于執(zhí)行 convert 命令的歷史記錄,可以執(zhí)行以下命令

幾乎所有的shell都會(huì)提供ctrl+R來做向后搜索

fsf命令可以交互式查找輸入內(nèi)容

zsh可以動(dòng)態(tài)搜索之前執(zhí)行過的命令的歷史記錄。

可以使用 ls -R 來遞歸列出某些目錄結(jié)構(gòu)

tree命令可以更加友好的方式來顯示目錄結(jié)構(gòu)

~/m/tools >>> tree

同樣是顯示目錄結(jié)構(gòu),有一個(gè)非常好用的工具broot

nnn 命令也非常好用,可以使用箭頭導(dǎo)航快速瀏覽


【筆記】BV1x7411H7wa P2的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
蚌埠市| 定结县| 松溪县| 宜春市| 湖口县| 金阳县| 来安县| 高阳县| 武安市| 道孚县| 松滋市| 新巴尔虎右旗| 稻城县| 自治县| 宜昌市| 都昌县| 密山市| 柳江县| 河北省| 乌海市| 平顺县| 崇明县| 浏阳市| 莲花县| 庆云县| 葫芦岛市| 左贡县| 台江县| 措美县| 郁南县| 汉源县| 正安县| 福建省| 苍梧县| 丰镇市| 沙洋县| 上林县| 马关县| 虞城县| 汾阳市| 富阳市|