Linux 命令與 Shell 腳本
【Linux文件處理 Day1】
前幾天主要介紹了正則表達(dá)式的使用方法淀歇,這一期打算介紹一些 Linux 命令和 Shell 腳本,這些知識(shí)雖然不是我們必須要掌握的蛮浑,但是它可以提高工作效率,而且這些知識(shí)對(duì)于開發(fā)者來(lái)說(shuō)都是通用的,Android香嗓,iOS垛叨,后端伦糯,前端等,都需要一些 Linux 和正則表達(dá)式的知識(shí)嗽元。對(duì)于iOS開發(fā)者來(lái)說(shuō)敛纲,Linux 的一些操作命令是薄弱環(huán)節(jié),作者打算花費(fèi)幾天時(shí)間總結(jié)一下這方面的知識(shí)剂癌,旨在能夠幫助更多同學(xué)不再害怕“命令”淤翔。如果在文中有不正確的地方,希望同學(xué)們能指點(diǎn)小弟一下佩谷。
【特別說(shuō)明】下文提到所有的命令行的根路徑均為:/Users/wangsuyan/desktop/linux旁壮,使用 man 某個(gè)命令
,比如 man rm
谐檀,可以查看詳細(xì)使用抡谐。
- 絕對(duì)路徑:從根目錄開始的全路徑,一定是以 "/" 開頭的稚补;
pwd : 當(dāng)前所在的目錄童叠,pwd:/Users/wangsuyan/desktop/linux,這個(gè)路徑也稱為絕對(duì)路徑; - . : 表示當(dāng)前目錄厦坛,pwd 可以顯示當(dāng)前所在的目錄五垮;
- .. : 上一級(jí)目錄,/Users/wangsuyan/desktop/linux 的上一級(jí)目錄為:/Users/wangsuyan/desktop杜秸;
- touch : 創(chuàng)建文件放仗,touch lefe.js,創(chuàng)建文件 lefe.js撬碟,如果當(dāng)前目錄下已經(jīng)有文件 lefe.js 文件诞挨,將修改 lefe.js 文件的創(chuàng)建時(shí)間;創(chuàng)建文件所在的目錄不能包含沒有創(chuàng)建的文件夾呢蛤;
- rm:移除文件惶傻,rm lefe.js 將移除 lefe.js 文件;
- mv: 移動(dòng)文件其障,mv lefe.js ../lefe2.js 將 lefe.js 文件移動(dòng)到上一級(jí)目錄银室,并重命名為 lefe2.js,lefe.js 文件將不在原目錄下励翼;
- cat: 查看文件內(nèi)容蜈敢,cat lefe.js 查看 lefe.js 的內(nèi)容;
- head: 查看文件的內(nèi)容汽抚,默認(rèn)為前 10 行抓狭,head lefe.js 查看文件的前 10 行內(nèi)容;
- head -n 20 lefe.js 查看文件的前 20 行內(nèi)容造烁;
- tail: 查看文件的內(nèi)容否过,默認(rèn)為末尾 10 行,tail lefe.js 查看文件的末尾 10 行內(nèi)容膨蛮;tail -n 20 lefe.js 查看文件的末尾 20 行內(nèi)容叠纹;
- cd(change directory): 進(jìn)入文件目錄;
- mkdir(make directory): 創(chuàng)建目錄敞葛,mkdir lefe 創(chuàng)建文件夾 lefe誉察,mkdir -p lefe/lefe2/lefe3 創(chuàng)建多個(gè)目錄;
- rmdir(remove directory): 移除目錄惹谐,rmdir lefe 刪除 lefe 目錄持偏,將提升
- rmdir: lefe: Directory not empty ,rmdir 只能刪除目錄中無(wú)文件的時(shí)候氨肌,使用 rm -r lefe 可以刪除 lefe 目錄及其所有的子目錄鸿秆;
- cp: 復(fù)制目錄到指點(diǎn)目錄中,cp lefe.js ../ 復(fù)制 lefe.js 文件到指定的目錄中怎囚,cp -r lefe ../ 復(fù)制目錄到指點(diǎn)目錄卿叽;
- ls: 顯示當(dāng)前目錄下的目錄桥胞,ls -l : 顯示文件的詳細(xì)信息,ls -a 顯示目錄下所有文件或文件夾考婴,包含隱藏的文件;
- chmod: 改變文件的權(quán)限贩虾,chomd +x ./lefe.sh 改 lefe.sh 的添加執(zhí)行權(quán)限,一般運(yùn)行腳本前需要給腳本添加此權(quán)限沥阱;
- file: 查看文件的類型缎罢,file lefe: lefe: directory,是目錄文件考杉;
- find: 查找文件策精;
- gzip: 壓縮文件,gzip lefe.js 壓縮 lefe.js 文件崇棠;
- gunzip: 解壓文件咽袜,gunzip lefe.js.gz;
- tar: 壓縮文件及其子文件枕稀,tar -zcvf lefe.tgz ./lefe 壓縮文件夾 lefe 為 lefe.tgz, tar -zxvf ./lefe.tgz 解壓 lefe.tgz 文件酬蹋;
【Linux字符處理 Day2】
- |:管道,兩個(gè)命令之間可以使用管道符“|”鏈接抽莱,它可以把一個(gè)命令的輸入作為下一個(gè)命令的輸出;
- grep: 搜索文本,
- grep day lefe.js 搜索 lefe.js 文件中的 day骄恶;
- grep -n day lefe.js 搜索 lefe.js 文件中的 day食铐,可以顯示文本所出現(xiàn)的行;
- grep -i day lefe.js 搜索 lefe.js 文件中的 day僧鲁,忽略大小寫虐呻;
- grep -c day lefe.js 搜索 lefe.js 文件中的 day 出現(xiàn)的次數(shù);
- grep -v day lefe.js 搜索 lefe.js 文件中不包含 day 的行寞秃;
- sort: 文本排序
- cat sort.js | sort 對(duì)文本進(jìn)行排序斟叼;
- cat sort.js | sort -r 對(duì)文本進(jìn)行反向排序;
- cat sort.js | sort -n 對(duì)文本進(jìn)行排序春寿,指定為數(shù)字朗涩,比如: 2,12绑改,3 如果不使用參數(shù) -n 排序結(jié)果為 12, 2, 3谢床;反之為 2, 3, 12:
- uniq: 刪除重復(fù)的行,一般與 sort 配合使用厘线,先排序识腿,然后多結(jié)果進(jìn)行去重;
- cat lefe.js | sort | uniq 顯示沒有重復(fù)的行造壮;
- tr: 文本轉(zhuǎn)換
- cat lefe.js | tr -d 'day':刪除 lefe.js 文件中的 'd','a' 和 ‘y’渡讼;
- paste: 文本合并
- paste -d '>' lefe.js sort.js:合并 lefe.js 和 sort.js 文件,是以行合并的,使用 '>' 鏈接兩個(gè)文件中的行成箫;
- find: 查找文件展箱,find 查找路徑 -name 文件名
- find ~/Desktop/linux -name 'lefe.js':查找 ~/Desktop/linux 下文件名為 lefe.js 的文件;
- find ~/Desktop/linux -name '*.js':查找 ~/Desktop/linux 下后綴為 ‘js’ 的文件伟众;
【Shell 腳本 Day3】
經(jīng)過(guò)前幾天對(duì) Linux 命令的學(xué)習(xí)析藕,已經(jīng)掌握了大部分常用的命令,但是如果想要做的更好凳厢,可以學(xué)習(xí)一下 Shell 腳本账胧,它可以把多條命令按自己的方式來(lái)執(zhí)行。它可以提高我們的工作效率先紫。比如最常見的是 pod install 命令治泥,每次需要在終端輸入:
cd /Users/wangsuyan/Desktop/project/Kmart
pod install
這種輸入需要我們切換到項(xiàng)目的根目錄,我們往往不記得自己項(xiàng)目的目錄遮精,查找時(shí)比較耗時(shí)居夹。我們完全可以使用一個(gè)腳本(podlgsk.sh),直接執(zhí)行(./podlgsk.sh)本冲。
#!/bin/bash
cd /Users/wangsuyan/desktop/project/Kmart
pod install
執(zhí)行(執(zhí)行前需要給腳本執(zhí)行權(quán)限准脂,chmod +x podlgsk.sh):
$ ./podlgsk.sh
感受到腳本的“魅力”后,我們可以感受一下 @唐巧_body 查找未使用的圖片的 shell 腳本檬洞。關(guān)于查找項(xiàng)目中未使用的圖片也可以參考這里的 Python 腳本狸膏,用了你就會(huì)愛上它(開玩笑呢,別當(dāng)真)添怔。
#!/bin/sh
cd /Users/wangsuyan/Desktop/project/Kmart
PROJ=`find . -name '*.xib' -o -name '*.[mh]'`
for png in `find . -name '*.png'`
do
name=`basename $png`
if ! grep -qhs "$name" "$PROJ"; then
echo "$png is not referenced"
fi
done
【解析】
- cd /Users/wangsuyan/Desktop/project/Kmart湾戳,進(jìn)入項(xiàng)目所在的目錄;
- 查找項(xiàng)目中所有 png 圖片广料;
- 遍歷所有的 png 圖片砾脑,使用 grep 命令查找項(xiàng)目中是否使用過(guò)該圖片,如果未使用將打印出 xxx is not referenced艾杏;
【知識(shí)點(diǎn)】
cd 命令(進(jìn)入項(xiàng)目的根目錄)韧衣;
find 命令(查找符合要求的文件,這里注意查找 xib购桑,.h 和 .m 文件)汹族;
grep 命令(查找文本內(nèi)容);
正則表達(dá)式其兴,比如:'.[hm]' 和 '.xib'顶瞒。 關(guān)于正則表達(dá)式的使用,上一期已經(jīng)專門介紹了元旬;
Shell 腳本中的 for 循環(huán)榴徐,if 條件判斷守问。
了解了 Shell 腳本的使用后,下一次將介紹一些它的基本語(yǔ)法坑资,幫助讀者可以看懂 Shell 腳本耗帕。
【Shell 腳本 Day4】
使用 Pod 的同學(xué)經(jīng)常會(huì)遇到 "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation."
錯(cuò)誤,其實(shí)是 [CP] Check Pods Manifest.lock
這個(gè)腳本所起的作用袱贮。
Pod 中有 Manifest.lock 和 Podfile.lock 這兩個(gè)文件仿便,只要這兩個(gè)文件的內(nèi)容不一樣就會(huì)報(bào)錯(cuò)上面這個(gè)錯(cuò)誤。Podfile.lock 是大家共用的文件(用來(lái)保證我們每個(gè)人的Pod庫(kù)版本一樣)攒巍,而Manifest.lock是本地的文件(自己用)嗽仪。而【圖2】中這個(gè)腳本正是做這樣的事情。
解釋下這個(gè)腳本:
shell 腳本總是以:#!/bin/bash
或者 #!/bin/sh
開頭柒莉,它主要告訴系統(tǒng)執(zhí)行這個(gè)文件需要那個(gè)解釋器闻坚,進(jìn)入 /bin 目錄下可以看到 bash 和 sh 解釋器;
- diff 命令:判斷兩個(gè)文件的不同兢孝,比如 diff /Users/lefe/Desktop/project/Kmart/Podfile.lock /Users/lefe/Desktop/project/Kmart/pods/Manifest.lock >~/Desktop/shell.log 比較兩個(gè)文件的不同窿凤,并重定向到 shell.log 文件中;
- > 重定向符號(hào)跨蟹,可以把輸出命令輸出到某個(gè)文件中而不是控制臺(tái)雳殊;
- echo 是腳本的輸出,相當(dāng)于 printf窗轩;
- exit 1 退出相种,有了這個(gè)命令 Xcode 就會(huì)報(bào)錯(cuò),你可以在 Xcode 中新建一個(gè)腳本品姓,試試下面這個(gè)腳本:
echo "This is a test shell created by Lefe_x"
exit 1
$?: 指上條命令執(zhí)行的結(jié)果,也就是 diff 執(zhí)行的結(jié)果箫措;
下面是 shell 中的 if 語(yǔ)句:
if 條件 ; then
fi
如何在終端執(zhí)行腳本:
假如有個(gè)叫 podlgsk.sh
的腳本腹备,只要給予它執(zhí)行權(quán)限(chmod +x podlgsk.sh
),注意只需要給一次執(zhí)行權(quán)限就行斤蔓,下次運(yùn)行腳本時(shí)就不需要給予執(zhí)行權(quán)限了植酥,然后直接 ./podlgsk.sh
即可。
===== 我是有底線的 ======
喜歡我的文章弦牡,歡迎關(guān)注我的新浪微博 Lefe_x友驮,我會(huì)不定期的分享一些開發(fā)技巧