Mac下Shell腳本使用

【原創(chuàng)博文,轉(zhuǎn)載請注明出處!】
準(zhǔn)備學(xué)習(xí)下Shell命令,俗話說“好記性不如爛筆頭”,做點筆記方便以后查找。詳細(xì)學(xué)習(xí)途徑請移步 --> Shell菜鳥教程

(一) Shell環(huán)境

Shell常識腦補(bǔ)
① Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程序設(shè)計語言。

② Shell 是指一種應(yīng)用程序,這個應(yīng)用程序提供了一個界面,用戶通過這個界面訪問操作系統(tǒng)內(nèi)核的服務(wù)。

③ Ken Thompson 的 sh 是第一種 Unix Shell,Windows Explorer 是一個典型的圖形界面 Shell。

④ Shell 腳本(shell script),是一種為 shell 編寫的腳本程序。

⑤ 業(yè)界所說的 shell 通常都是指 shell 腳本,但讀者朋友要知道,shell 和 shell script 是兩個不同的概念。

⑥一般 新建一個文件擴(kuò)展名為 sh(sh代表shell),擴(kuò)展名并不影響腳本執(zhí)行,見名知意就好,如果你用 php 寫 shell 腳本,擴(kuò)展名就用 php 好了。

由于習(xí)慣的原因,簡潔起見,本文出現(xiàn)的 "shell編程" 都是指 shell 腳本編程,不是指開發(fā) shell 自身。
創(chuàng)建一個Shell腳本(test.sh)

打開終端 -->cd到腳本要存放的位置 (如:我想在桌面上創(chuàng)建一個Shell文件夾,并在該文件夾里新建一個test.sh的腳本文件)。
使用文本編輯器(Xcode,CS Code等其他編輯器都可以)打開test.sh,并加入如下兩行code:

#!/bin/bash
echo "Hello World !"

"#!" 是一個約定的標(biāo)記,它告訴系統(tǒng)這個腳本需要什么解釋器來執(zhí)行,即使用哪一種 Shell。
"echo" 命令用于向窗口輸出文本。

Shell腳本執(zhí)行方式

1、作為可執(zhí)行程序
將上面的代碼保存為 test.sh,并 cd 到相應(yīng)目錄:

chmod +x ./test.sh  #使腳本具有執(zhí)行權(quán)限
./test.sh  #執(zhí)行腳本

注意,一定要寫成 ./test.sh,而不是 test.sh,運行其它二進(jìn)制的程序也一樣,直接寫 test.sh,linux 系統(tǒng)會去 PATH 里尋找有沒有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的當(dāng)前目錄通常不在 PATH 里,所以寫成 test.sh 是會找不到命令的,要用 ./test.sh 告訴系統(tǒng)說,就在當(dāng)前目錄找。

2、作為解釋器參數(shù)

這種運行方式是,直接運行解釋器,其參數(shù)就是 shell 腳本的文件名,如:

/bin/sh test.sh
/bin/php test.php

這種方式運行的腳本,不需要在第一行指定解釋器信息,寫了也沒用。

下面我們嘗試用方法1在終端執(zhí)行test.sh腳本,成功運行會輸出“Hello World!”。
將上面的代碼保存好,并在終端 cd 到相應(yīng)目錄(即Shell的位置)

終端執(zhí)行腳本指令.jpg

可以看到成功地輸出了“Hello World! ”(當(dāng)然方法2更簡單,不需要指定腳解釋器信息,寫了也沒用)。如果不想這么麻煩,直接看到“Hello World!”,你也可以在終端直接輸入 echo "Hello World"嘛,但是終端畢竟不是我等凡夫俗子能駕馭的

(二) Shell基本語法

A.變量

示例:定義一個變量名name并賦值為Rephontil

name="Rephontil"

需要注意的是:變量名和等號之間不能有空格,這與我們之前熟悉的所有編程語言都不一樣(足以奇葩)。

使用變量,只要在變量名前面加美元符號即可,如:

name="Rephontil"
方式one  --->   echo $name
方式two  --->   echo ${name}

變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界,比如下面這種情況:

studentName="小明"
方式1  --->  echo "那位調(diào)皮的同學(xué)叫${studentName}"
方式2  --->  echo "那位調(diào)皮的同學(xué)叫$studentName"

方式1 成功顯示“那位調(diào)皮的同學(xué)叫小明”
方式2 成功顯示“那位調(diào)皮的同學(xué)叫studentName”。這顯然
總結(jié):Shell編程推薦給所有變量加上花括號,這是個好的編程習(xí)慣。

B.數(shù)組

bash支持一維數(shù)組(不支持多維數(shù)組),并且沒有限定數(shù)組的大小
類似與C語言,數(shù)組元素的下標(biāo)由0開始編號。獲取數(shù)組中的元素要利用下標(biāo),下標(biāo)可以是整數(shù)或算術(shù)表達(dá)式,其值應(yīng)大于或等于0。

定義數(shù)組
在Shell中,用括號來表示數(shù)組,數(shù)組元素用"空格"符號分割開。定義數(shù)組的一般形式為:數(shù)組名=(值1 值2 ... 值n)
如:nameArr=("football" "足球" "籃球" "羽毛球")
讀取數(shù)組
讀取數(shù)組元素值的一般格式是:
{數(shù)組名[下標(biāo)]} 如:echo{nameArr[0]} -> football
使用@符號可以獲取數(shù)組中的所有元素,例如:
echo ${nameArr[@]} -> football 足球 籃球 羽毛球

獲取數(shù)組的長度
獲取數(shù)組長度的方法與獲取字符串長度的方法相同,例如:

# 取得數(shù)組元素的個數(shù)
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得數(shù)組單個元素的長度
length=${#array_name[n]}

C.注釋

以"#"開頭的行就是注釋,會被解釋器忽略。

sh里沒有多行注釋,只能每一行加一個#號。
如果在開發(fā)過程中,遇到大段的代碼需要臨時注釋起來,過一會兒又取消注釋,怎么辦呢?

每一行加個"#"符號太費力了,可以把這一段要注釋的代碼用一對花括號括起來,定義成一個函數(shù),沒有地方調(diào)用這個函數(shù),這塊代碼就不會執(zhí)行,達(dá)到了和注釋一樣的效果。

D.傳遞參數(shù)

我們可以在執(zhí)行 Shell 腳本時,向腳本傳遞參數(shù),腳本內(nèi)獲取參數(shù)的格式為:$n。n 代表一個數(shù)字,1 為執(zhí)行腳本的第一個參數(shù),2 為執(zhí)行腳本的第二個參數(shù),以此類推……

echo "Shell 傳遞參數(shù)實例!";
echo "執(zhí)行的文件名:$0";
echo "第一個參數(shù)為:$1";
echo "第二個參數(shù)為:$2";
echo "第三個參數(shù)為:$3";

在終端執(zhí)行腳本后log如下(1 2 3為我們傳入的3個參數(shù)):
Rephontil:Shell zhouyong$ /bin/sh test.sh 1 2 3
Shell 傳遞參數(shù)實例!
執(zhí)行的文件名:test.sh
第一個參數(shù)為:1
第二個參數(shù)為:2
第三個參數(shù)為:3

注:其中 $0 為執(zhí)行的文件名。
另外,還有幾個特殊字符用來處理參數(shù),下表所列:


幾個特殊字符用來處理參數(shù).png

說明:怎么看* 與@ 區(qū)別?

相同點:都是引用所有參數(shù)。
不同點:只有在雙引號中體現(xiàn)出來。假設(shè)在腳本運行時寫了三個參數(shù) 1、2、3,,則 " * " 等價于 "1 2 3"(傳遞了一個參數(shù)),而 "@" 等價于 "1" "2" "3"(傳遞了三個參數(shù))。

# ①  $*
for i in "$*"; do
echo $I
done

# ②  $@
for i in "$@"; do
echo $I
done

①結(jié)果為: 1 2 3
②結(jié)果為:
1
2
3
明顯看出:①結(jié)果為一個整體  ②結(jié)果保持傳進(jìn)去的獨立個體

E.Shell 基本運算符

Shell 和其他編程語言一樣,支持多種運算符,包括:

算數(shù)運算符
關(guān)系運算符
布爾運算符
字符串運算符
文件測試運算符
原生bash不支持簡單的數(shù)學(xué)運算,但是可以通過其他命令來實現(xiàn),例如 awk 和 expr,expr 最常用。

expr 是一款表達(dá)式計算工具,使用它能完成表達(dá)式的求值操作。

例如,兩個數(shù)相加(注意使用的是反引號 ` 而不是單引號 '):
注意要點:

a.表達(dá)式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數(shù)編程語言不一樣。
b.完整的表達(dá)式要被 ` ` 包含,注意這個字符不是常用的單引號,在 Esc 鍵下邊。

算術(shù)運算符表
算術(shù)運算符表.jpg
注意:條件表達(dá)式要放在方括號之間,并且要有空格,例如: [a==b] 是錯誤的,必須寫成 [ a ==b ]。

關(guān)系運算符
關(guān)系運算符.jpg

布爾運算符
布爾運算符.png

邏輯運算符
邏輯運算符.png

字符串運算符
字符串運算符.png

文件測試運算符
文件測試運算符.png
圖片發(fā)自簡書App
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,695評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 什么是Shell腳本 示例 看個例子吧: !/bin/sh cd ~ mkdir shell_tut cd she...
    碼農(nóng)朱同學(xué)閱讀 2,535評論 0 5
  • 先鄙夷一下自己的靈魂 然后接著混吃等死
    Iferonuser閱讀 283評論 0 0
  • 一 有個朋友拐彎抹角的找到我的電話,打電話給我拜托我?guī)退齻鱾€話。 要傳話的那個人,其實曾經(jīng)是我們共同的朋友,...
    幸福D蘇眉閱讀 3,537評論 1 2

友情鏈接更多精彩內(nèi)容