Shell腳本:Linux Shell腳本學(xué)習(xí)指南
菜鳥教程 - Shell教程
Linux入門 - Shell腳本是什么
Linux chmod命令
一、Shell是什么
Shell 是一個應(yīng)用程序翻斟,它連接了用戶和 Linux 內(nèi)核茫蛹,讓用戶能夠更加高效、安全扯罐、低成本地使用 Linux 內(nèi)核橄登,這就是 Shell 的本質(zhì)轧膘。
?
? shell其實是一個命令解釋器,由于安全舟山、復(fù)雜救崔、繁瑣等原因,用戶不能直接接觸內(nèi)核(也沒有必要)捏顺,需要另外再開發(fā)一個程序六孵,讓用戶直接使用這個程序;該程序的作用就是接收用戶的操作(點擊圖標(biāo)幅骄、輸入命令)劫窒,并進(jìn)行簡單的處理,然后再傳遞給內(nèi)核拆座,這樣用戶就能間接地使用操作系統(tǒng)內(nèi)核了主巍。你看,在用戶和內(nèi)核之間增加一層“代理”挪凑,既能簡化用戶的操作孕索,又能保障內(nèi)核的安全,何樂不為呢躏碳?在Linux下搞旭,這個命令行程序叫做 Shell。
? Shell 本身并不是內(nèi)核的一部分菇绵,它只是站在內(nèi)核的基礎(chǔ)上編寫的一個應(yīng)用程序肄渗,它和 QQ、迅雷咬最、Firefox 等其它軟件沒有什么區(qū)別翎嫡。然而 Shell 也有著它的特殊性,就是開機(jī)立馬啟動永乌,并呈現(xiàn)在用戶面前惑申;用戶通過 Shell 來使用 Linux具伍,不啟動 Shell 的話,用戶就沒辦法使用 Linux圈驼。
- 交互的方式:從鍵盤輸入命令人芽,通過/bin/bash的解析,可以立即得到Shell的回應(yīng)
[root@clsn ~]# ls
anaconda-ks.cfg
- 非交互的方式:如果我們的命令或者應(yīng)用程序不在命令行直接執(zhí)行碗脊,而是通過一個程序文件來執(zhí)行時啼肩,這個程序就被稱之為shell腳本橄妆,通過文件執(zhí)行腳本的方式稱之為非交互方式
[root@clsn ~]# ./firstShell.sh
拓展:命令行提示符
[mozhiyan@localhost ~]$
- []是提示符的分隔符號衙伶,沒有特殊含義。
- mozhiyan表示當(dāng)前登錄的用戶害碾,我現(xiàn)在使用的是 mozhiyan 用戶登錄矢劲。
- @是分隔符號,沒有特殊含義慌随。
- localhost表示當(dāng)前系統(tǒng)的簡寫主機(jī)名(完整主機(jī)名是 localhost.localdomain)芬沉。
- ~代表用戶當(dāng)前所在的目錄為主目錄(home 目錄)。如果用戶當(dāng)前位于主目錄下的 bin 目錄中阁猜,那么這里顯示的就是- bin丸逸。
- $是命令提示符。Linux 用這個符號標(biāo)識登錄的用戶權(quán)限等級:如果是超級用戶(root 用戶)剃袍,提示符就是#黄刚;如果是普通用戶,提示符就是$民效。
二憔维、Shell 是一種腳本語言
任何代碼最終都要被“翻譯”成二進(jìn)制的形式才能在計算機(jī)中執(zhí)行。
有的編程語言畏邢,如 C/C++业扒、Pascal、Go語言舒萎、匯編等程储,必須在程序運(yùn)行之前將所有代碼都翻譯成二進(jìn)制形式,也就是生成可執(zhí)行文件臂寝,用戶拿到的是最終生成的可執(zhí)行文件虱肄,看不到源碼。
這個過程叫做<u>編譯(Compile)</u>交煞,這樣的編程語言叫做<u>編譯型語言</u>咏窿,完成編譯過程的軟件叫做<u>編譯器(Compiler)</u>。
而有的編程語言素征,如 Shell集嵌、JavaScript萝挤、Python、PHP等根欧,需要一邊執(zhí)行一邊翻譯怜珍,不會生成任何可執(zhí)行文件,用戶必須拿到源碼才能運(yùn)行程序凤粗。程序運(yùn)行后會即時翻譯酥泛,翻譯完一部分執(zhí)行一部分,不用等到所有代碼都翻譯完嫌拣。
這個過程叫做<u>解釋</u>柔袁,這樣的編程語言叫做<u>解釋型語言或者腳本語言(Script)</u>,完成解釋過程的軟件叫做<u>解釋器</u>异逐。
編譯型語言的優(yōu)點是執(zhí)行速度快捶索、對硬件要求低、保密性好灰瞻,適合開發(fā)操作系統(tǒng)腥例、大型應(yīng)用程序、數(shù)據(jù)庫等酝润。
腳本語言的優(yōu)點是使用靈活燎竖、部署容易没讲、跨平臺性好猾漫,非常適合 Web 開發(fā)以及小工具的制作揩瞪。
Shell 就是一種腳本語言睹欲,我們編寫完源碼后不用編譯蠢护,直接運(yùn)行源碼即可鱼蝉。
三淑廊、Shell的分類
Shell種類全稱 | 縮寫 | 概要 |
---|---|---|
Bourne Shell | sh | sh 是 UNIX 上的標(biāo)準(zhǔn) shell鸽捻,很多 UNIX 版本都配有 sh凳鬓。sh 是第一個流行的 Shell茁肠。由 AT&T 公司的 Steve Bourne開發(fā),為了紀(jì)念他缩举,就用他的名字命名了垦梆。 |
Boume Again | Bash | Bash 由 GNU 組織開發(fā),保持了對 sh shell 的兼容性仅孩,是各種 Linux 發(fā)行版 默認(rèn)配置的 shell托猩。 |
C Shell | csh | C Shell 是廣為流行的 Shell 變種。C Shell 主要在 BSD 版的 UNIX 系統(tǒng)中使用辽慕,發(fā)明者是柏克萊大學(xué)的 Bill Joy京腥。C Shell 因為其語法和 C 語言類似而得名,這也使得 UNIX 的系統(tǒng)工程師在學(xué)習(xí) C Shell 時感到相當(dāng)方便溅蛉。 |
TC Shell | tcsh | tcsh 是 csh 的增強(qiáng)版公浪,加入了命令補(bǔ)全功能他宛,提供了更加強(qiáng)大的語法支持。 |
Z Shell | zsh | Zsh屬于Shell中的一種欠气,但比Bash好用厅各,而且完全兼容Bash,擁有及其豐富的插件预柒。 |
? ~ bash -version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
四队塘、查看系統(tǒng)中的shell
4.1、查看系統(tǒng)中的shell
? ~ cat /etc/shells
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
4.2宜鸯、查看默認(rèn)shell
? ~ echo $SHELL
/bin/zsh
4.3憔古、修改系統(tǒng)默認(rèn)shell
當(dāng)前默認(rèn)為zsh,改為bash
? ~ chsh -s /bin/bash
Changing shell for qiyeyun.
Password for qiyeyun:
輸入密碼顾翼,重啟Terminal投放,完成奈泪。
4.4适贸、切換shell
// 默認(rèn)shell
? ~ echo $SHELL
/bin/zsh
// 切換bash
? ~ bash
bash-3.2$
// 返回默認(rèn)shell
? ~ bash
bash-3.2$ exit
exit
? ~
4.5、查看zsh/bash版本
? ~ zsh --version
zsh 5.3 (x86_64-apple-darwin18.0)
? ~ bash -version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
五涝桅、Hello World
5.1拜姿、編寫hello world腳本
? ~ vim helloworld.sh
// 在文本寫入
#!/bin/bash
echo "Hello World!!!"
// :wq 保存
5.2、執(zhí)行報錯冯遂,添加權(quán)限
1.執(zhí)行報錯
? ~ ./helloworld.sh
permission denied: ./helloworld.sh // 錯誤提示蕊肥,沒有權(quán)限執(zhí)行
2.添加權(quán)限 - Linux chmod命令
? ~ chmod abc file
其中a,b,c各為一個數(shù)字,分別表示<u>User蛤肌、Group壁却、及Other</u>的權(quán)限。
r=4裸准,w=2展东,x=1
- 若要rwx屬性則4+2+1=7;
- 若要rw-屬性則4+2=6炒俱;
- 若要r-x屬性則4+1=5盐肃。
3.再次執(zhí)行腳本
? ~ chmod 777 helloworld.sh
? ~ ./helloworld.sh
Hello World!!!
5.3、執(zhí)行腳本的幾種方式
1. 直接使用 Bash 去解釋腳本中的內(nèi)容
? ~ bash helloworld.sh
Hello World!!!
2. 絕對路徑/相對路徑執(zhí)行
? ~ /Users/github/Shell學(xué)習(xí)/helloworld.sh
Hello World!!!
? ~ ./helloworld.sh
Hello World!!!
3. source命令 等同于 .
? ~ source helloworld.sh
Hello World!!!
? ~ . helloworld.sh
Hello World!!!
4. 將腳本加入系統(tǒng)命令
Shell 腳本是否可以像 Linux 系統(tǒng)命令一樣权悟,不用指定路徑砸王,直接運(yùn)行呢?當(dāng)然是可以的峦阁,不過需要進(jìn)行環(huán)境變量的配置谦铃。
====== 測試在bash環(huán)境下,而不是zsh下 ======
1榔昔、打開環(huán)境變量文件
$ open ./.bash_profile
2驹闰、在.bash_profile文件中加入shell腳本的路徑凿跳, 注意:是目錄,不需要文件
# add by linxiang 2019.08.07 for shell script
export PATH=/Users/qiyeyun/Downloads:$PATH
3疮方、執(zhí)行命令立即加載生效
$ source ./.bash_profile
4控嗜、查看PATH
$ echo $PATH
/Users/qiyeyun/Downloads:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Wireshark.app/Contents/MacOS:/Users/qiyeyun/.rvm/bin
5、腳本能在任意目錄下用啦
$ helloworld.sh
Hello World!!!
5. 拓展:(source與.命令)
source命令(從 C Shell 而來)是bash shell的內(nèi)置命令骡显。
. 命令 就是個點符號(從Bourne Shell而來)是source的另一名稱疆栏。
六、執(zhí)行方式 bash惫谤、 "." 壁顶、"./" 、source比較
新建一個 test.sh
#!/bin/bash
# PPID父進(jìn)程 溜歪,當(dāng)前進(jìn)程為$$
echo PID is $$
echo Parent PID is $PPID
開啟全部權(quán)限
$ chmod 777 test.sh
6.1若专、是否創(chuàng)建子shell
分別用不同方式執(zhí)行
$ echo $$
2163
$ bash test.sh
PID is 2253
Parent PID is 2163
$ ./test.sh
PID is 2254
Parent PID is 2163
$ /Users/qiyeyun/github/iOS-/Shell學(xué)習(xí)/test.sh
PID is 2258
Parent PID is 2163
$ source test.sh
PID is 2163
Parent PID is 2162
$ . test.sh
PID is 2163
Parent PID is 2162
結(jié)論:
- bash和"./"命令都是打開一個子shell來讀取并執(zhí)行FileName中命令;
- source是與"."類似,是在當(dāng)前工作環(huán)境中執(zhí)行蝴猪,配置文件就是影響當(dāng)前的工作環(huán)境调衰,這種情況下用source;
6.2自阱、關(guān)閉執(zhí)行權(quán)限
將執(zhí)行權(quán)限全部關(guān)閉
$ chmod 666 test.sh
再一次執(zhí)行
$ bash test.sh
PID is 2234
Parent PID is 2163
$ ./test.sh
-bash: ./test.sh: Permission denied
$ /Users/qiyeyun/github/iOS-/Shell學(xué)習(xí)/test.sh
-bash: /Users/qiyeyun/github/iOS-/Shell學(xué)習(xí)/test.sh: Permission denied
$ source test.sh
PID is 2163
Parent PID is 2162
$ . test.sh
PID is 2163
Parent PID is 2162
結(jié)論:
- "./"(相對/絕對路徑)執(zhí)行需要執(zhí)行權(quán)限嚎莉;
6.3、表格
執(zhí)行方式 | 無執(zhí)行權(quán)限是否可執(zhí)行 | 是否打開子shell |
---|---|---|
bash | 可執(zhí)行 | 打開子shell |
./(相對/絕對路徑) | 無法執(zhí)行 | 打開子shell |
source / . | 可執(zhí)行 | 當(dāng)前shell環(huán)境 |