Shell學(xué)習(xí)筆記-基礎(chǔ)入門

走進(jìn) Shell 編程的大門

什么是 Shell?

簡(jiǎn)單來說,Shell編程就是對(duì)一堆Linux命令的邏輯化處理畜伐。

W3Cschool 上的一篇文章是這樣介紹 Shell的玛界,如下圖所示:

Shell 編程之 Hello World

學(xué)習(xí)任何一門編程語言第一件事就是輸出HelloWord了笨枯!

下面我會(huì)從新建文件到shell代碼編寫來說下Shell 編程如何輸出Hello World馅精。

1.新建一個(gè)文件 helloworld.sh :touch helloworld.sh粱檀,擴(kuò)展名為 sh(sh代表Shell)(擴(kuò)展名并不影響腳本執(zhí)行茄蚯,見名知意就好渗常,如果你用 php 寫 shell 腳本凳谦,擴(kuò)展名就用 php 好了)

2.使腳本具有執(zhí)行權(quán)限:chmod +x helloworld.sh

3.使用 vim 命令修改helloworld.sh文件:vim helloworld.sh

vim 文件------>進(jìn)入文件----->命令模式------>按i進(jìn)入編輯模式----->編輯文件 ------->按Esc進(jìn)入底行模式----->輸入:wq/q! (輸入wq代表寫入內(nèi)容并退出尸执,即保存;輸入q!代表強(qiáng)制退出不保存)

helloworld.sh 內(nèi)容如下:

#!/bin/bash
#第一個(gè)shell小程序,echo 是linux中的輸出命令绊诲。
echo  "helloworld!"

shell中 # 符號(hào)表示注釋掂之。shell 的第一行比較特殊世舰,一般都會(huì)以#!開始來指定使用的 shell 類型跟压。在linux中,除了bash shell以外茸塞,還有很多版本的shell钾虐, 例如zsh效扫、dash等等...不過bash shell還是我們使用最多的无切。

4.運(yùn)行腳本:./helloworld.sh 哆键。(注意籍嘹,一定要寫成 ./helloworld.sh 辱士,而不是 helloworld.sh 颂碘,運(yùn)行其它二進(jìn)制的程序也一樣。)

直接寫 helloworld.sh 塔拳,linux 系統(tǒng)會(huì)去 PATH 里尋找有沒有叫 test.sh 的靠抑,而只有 /bin, /sbin, /usr/bin颂碧,/usr/sbin 等在 PATH 里载城,你的當(dāng)前目錄通常不在 PATH 里诉瓦,所以寫成 helloworld.sh 是會(huì)找不到命令的,要用./helloworld.sh 告訴系統(tǒng)說,就在當(dāng)前目錄找猴贰。

Shell 變量

Shell 編程中的變量介紹

Shell編程中一般分為三種變量:

  1. 自定義變量: 我們自己定義的變量,僅在當(dāng)前 Shell 實(shí)例中有效栅干,其他 Shell 啟動(dòng)的程序不能訪問局部變量碱鳞。
  2. Linux已定義的環(huán)境變量(環(huán)境變量踱蛀, 例如:PATH,HOME 等..., 這類變量我們可以直接使用)率拒,使用 env 命令可以查看所有的環(huán)境變量猬膨,而set命令既可以查看環(huán)境變量也可以查看自定義變量勃痴。
  3. Shell變量 :Shell變量是由 Shell 程序設(shè)置的特殊變量召耘。Shell 變量中有一部分是環(huán)境變量污它,有一部分是局部變量,這些變量保證了 Shell 的正常運(yùn)行

常用的環(huán)境變量:

PATH 決定了shell將到哪些目錄中尋找命令或程序

HOME 當(dāng)前用戶主目錄

HISTSIZE 歷史記錄數(shù)

LOGNAME 當(dāng)前用戶的登錄名

HOSTNAME 指主機(jī)的名稱

SHELL 當(dāng)前用戶Shell類型

LANGUGE  語言相關(guān)的環(huán)境變量歇攻,多語言可以修改此環(huán)境變量

MAIL 當(dāng)前用戶的郵件存放目錄

PS1 基本提示符缴守,對(duì)于root用戶是#屡穗,對(duì)于普通用戶是$

使用 Linux 已定義的環(huán)境變量:

比如我們要看當(dāng)前用戶目錄可以使用:echo $HOME命令村砂;如果我們要看當(dāng)前用戶Shell類型 可以使用echo $SHELL命令础废∑老伲可以看出蒿讥,使用方法非常簡(jiǎn)單锋拖。

使用自己定義的變量:

#!/bin/bash
#自定義變量hello
hello="hello world"http://中間不能有空格
echo $hello
echo  "helloworld!"

Shell 編程中的變量名的命名的注意事項(xiàng):

  • 命名只能使用英文字母侥钳,數(shù)字和下劃線舷夺,首個(gè)字符不能以數(shù)字開頭给猾,但是可以使用下劃線(_)開頭颂跨。
  • 中間不能有空格恒削,可以使用下劃線(_)。
  • 不能使用標(biāo)點(diǎn)符號(hào)每币。
  • 不能使用bash里的關(guān)鍵字(可用help命令查看保留關(guān)鍵字)兰怠。

Shell 字符串入門

字符串是shell編程中最常用最有用的數(shù)據(jù)類型(除了數(shù)字和字符串李茫,也沒啥其它類型好用了)揭保,字符串可以用單引號(hào),也可以用雙引號(hào)魄宏。這點(diǎn)和Java中有所不同掖举。

單引號(hào)字符串:

#!/bin/bash
name='SnailClimb'
hello='Hello, I  am '$name'!'
echo $hello

輸出內(nèi)容:

Hello, I am SnailClimb!

雙引號(hào)字符串:

#!/bin/bash
name='SnailClimb'
hello="Hello, I  am "$name"!"
echo $hello

輸出內(nèi)容:

Hello, I am SnailClimb!

Shell 字符串常見操作

拼接字符串:

#!/bin/bash
name="SnailClimb"
# 使用雙引號(hào)拼接
greeting="hello, "$name" !"
greeting_1="hello, ${name} !"
echo $greeting  $greeting_1
# 使用單引號(hào)拼接
greeting_2='hello, '$name' !'
greeting_3='hello, ${name} !'
echo $greeting_2  $greeting_3

輸出結(jié)果:

獲取字符串長(zhǎng)度:

#!/bin/bash
#獲取字符串長(zhǎng)度
name="SnailClimb"
# 第一種方式
echo ${#name} #輸出 10
# 第二種方式
expr length "$name";

輸出結(jié)果:

10
10

使用 expr 命令時(shí),表達(dá)式中的運(yùn)算符左右必須包含空格娜庇,如果不包含空格,將會(huì)輸出表達(dá)式本身:

expr 5+6    // 直接輸出 5+6
expr 5 + 6       // 輸出 11

對(duì)于某些運(yùn)算符名秀,還需要我們使用符號(hào)""進(jìn)行轉(zhuǎn)義,否則就會(huì)提示語法錯(cuò)誤藕溅。

expr 5 * 6       // 輸出錯(cuò)誤
expr 5 \* 6      // 輸出30

截取子字符串:

簡(jiǎn)單的字符串截蓉暗谩:

#從字符串第 1 個(gè)字符開始往后截取 10 個(gè)字符
str="SnailClimb is a great man"
echo ${str:0:10} #輸出:SnailClimb

根據(jù)表達(dá)式截取:

#!bin/bash
var="http://www.runoob.com/linux/linux-shell-variable.html"

s1=${var%%t*} #取第一個(gè)t前面的:h
s2=${var%t*}  #取最后一個(gè)t前面的:http://www.runoob.com/linux/linux-shell-variable.h
s3=${var%%.*} #取第一個(gè).前面的:http://www
s4=${var#*/}  #取第一個(gè)/后面的:/www.runoob.com/linux/linux-shell-variable.html
s5=${var##*/} #取最后一個(gè)/后面的:linux-shell-variable.html

Shell 數(shù)組

bash支持一維數(shù)組(不支持多維數(shù)組)巾表,并且沒有限定數(shù)組的大小汁掠。我下面給了大家一個(gè)關(guān)于數(shù)組操作的 Shell 代碼示例,通過該示例大家可以知道如何創(chuàng)建數(shù)組集币、獲取數(shù)組長(zhǎng)度考阱、獲取/刪除特定位置的數(shù)組元素、刪除整個(gè)數(shù)組以及遍歷數(shù)組鞠苟。

#!/bin/bash
array=(1 2 3 4 5);
# 獲取數(shù)組長(zhǎng)度
length=${#array[@]}
# 或者
length2=${#array[*]}
#輸出數(shù)組長(zhǎng)度
echo $length #輸出:5
echo $length2 #輸出:5
# 輸出數(shù)組第三個(gè)元素
echo ${array[2]} #輸出:3
unset array[1]# 刪除下表為1的元素也就是刪除第二個(gè)元素
for i in ${array[@]};do echo $i ;done # 遍歷數(shù)組乞榨,輸出: 1 3 4 5 
unset arr_number; # 刪除數(shù)組中的所有元素
for i in ${array[@]};do echo $i ;done # 遍歷數(shù)組,數(shù)組元素為空当娱,沒有任何輸出內(nèi)容

Shell 基本運(yùn)算符

說明:圖片來自《菜鳥教程》

Shell 編程支持下面幾種運(yùn)算符

  • 算數(shù)運(yùn)算符
  • 關(guān)系運(yùn)算符
  • 布爾運(yùn)算符
  • 字符串運(yùn)算符
  • 文件測(cè)試運(yùn)算符

算數(shù)運(yùn)算符

我以加法運(yùn)算符做一個(gè)簡(jiǎn)單的示例:

#!/bin/bash
a=3;b=3;
val=`expr $a + $b`
#輸出:Total value : 6
echo "Total value : $val

關(guān)系運(yùn)算符

關(guān)系運(yùn)算符只支持?jǐn)?shù)字吃既,不支持字符串,除非字符串的值是數(shù)字跨细。

通過一個(gè)簡(jiǎn)單的示例演示關(guān)系運(yùn)算符的使用鹦倚,下面shell程序的作用是當(dāng)score=100的時(shí)候輸出A否則輸出B。

#!/bin/bash
score=90;
maxscore=100;
if [ $score -eq $maxscore ]
then
   echo "A"
else
   echo "B"
fi

輸出結(jié)果:

B

邏輯運(yùn)算符

示例:

#!/bin/bash
a=$(( 1 && 0))
# 輸出:0冀惭;邏輯與運(yùn)算只有相與的兩邊都是1震叙,與的結(jié)果才是1掀鹅;否則與的結(jié)果是0
echo $a;

布爾運(yùn)算符

這里就不做演示了,應(yīng)該挺簡(jiǎn)單的捐友。

字符串運(yùn)算符

簡(jiǎn)單示例:

#!/bin/bash
a="abc";
b="efg";
if [ $a = $b ]
then
   echo "a 等于 b"
else
   echo "a 不等于 b"
fi

輸出:

a 不等于 b

文件相關(guān)運(yùn)算符

使用方式很簡(jiǎn)單淫半,比如我們定義好了一個(gè)文件路徑file="/usr/learnshell/test.sh" 如果我們想判斷這個(gè)文件是否可讀,可以這樣if [ -r $file ] 如果想判斷這個(gè)文件是否可寫匣砖,可以這樣-w $file科吭,是不是很簡(jiǎn)單。

shell流程控制

if 條件語句

簡(jiǎn)單的 if else-if else 的條件語句示例

#!/bin/bash
a=3;
b=9;
if [ $a = $b ]
then
   echo "a 等于 b"
elif [ $a > $b ]
then
   echo "a 大于 b"
else
   echo "a 小于 b"
fi

輸出結(jié)果:

a 大于 b

相信大家通過上面的示例就已經(jīng)掌握了 shell 編程中的 if 條件語句猴鲫。不過对人,還要提到的一點(diǎn)是,不同于我們常見的 Java 以及 PHP 中的 if 條件語句拂共,shell if 條件語句中不能包含空語句也就是什么都不做的語句牺弄。

for 循環(huán)語句

通過下面三個(gè)簡(jiǎn)單的示例認(rèn)識(shí) for 循環(huán)語句最基本的使用,實(shí)際上 for 循環(huán)語句的功能比下面你看到的示例展現(xiàn)的要大得多宜狐。

輸出當(dāng)前列表中的數(shù)據(jù):

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

產(chǎn)生 10 個(gè)隨機(jī)數(shù):

#!/bin/bash
for i in {0..9};
do 
   echo $RANDOM;
done

輸出1到5:

通常情況下 shell 變量調(diào)用需要加 $,但是 for 的 (()) 中不需要,下面來看一個(gè)例子:

#!/bin/bash
for((i=1;i<=5;i++));do
    echo $i;
done;

while 語句

基本的 while 循環(huán)語句:

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

while循環(huán)可用于讀取鍵盤信息:

echo '按下 <CTRL-D> 退出'
echo -n '輸入你最喜歡的電影: '
while read FILM
do
    echo "是的势告!$FILM 是一個(gè)好電影"
done

輸出內(nèi)容:

按下 <CTRL-D> 退出
輸入你最喜歡的電影: 變形金剛
是的!變形金剛 是一個(gè)好電影

無線循環(huán):

while true
do
    command
done

shell 函數(shù)

不帶參數(shù)沒有返回值的函數(shù)

#!/bin/bash
function(){
    echo "這是我的第一個(gè) shell 函數(shù)!"
}
function

輸出結(jié)果:

這是我的第一個(gè) shell 函數(shù)!

有返回值的函數(shù)

輸入兩個(gè)數(shù)字之后相加并返回結(jié)果:

#!/bin/bash
funWithReturn(){
    echo "輸入第一個(gè)數(shù)字: "
    read aNum
    echo "輸入第二個(gè)數(shù)字: "
    read anotherNum
    echo "兩個(gè)數(shù)字分別為 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "輸入的兩個(gè)數(shù)字之和為 $?"

輸出結(jié)果:

輸入第一個(gè)數(shù)字: 
1
輸入第二個(gè)數(shù)字: 
2
兩個(gè)數(shù)字分別為 1 和 2 !
輸入的兩個(gè)數(shù)字之和為 3

帶參數(shù)的函數(shù)

#!/bin/bash
funWithParam(){
    echo "第一個(gè)參數(shù)為 $1 !"
    echo "第二個(gè)參數(shù)為 $2 !"
    echo "第十個(gè)參數(shù)為 $10 !"
    echo "第十個(gè)參數(shù)為 ${10} !"
    echo "第十一個(gè)參數(shù)為 ${11} !"
    echo "參數(shù)總數(shù)有 $# 個(gè)!"
    echo "作為一個(gè)字符串輸出所有參數(shù) $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

輸出結(jié)果:

第一個(gè)參數(shù)為 1 !
第二個(gè)參數(shù)為 2 !
第十個(gè)參數(shù)為 10 !
第十個(gè)參數(shù)為 34 !
第十一個(gè)參數(shù)為 73 !
參數(shù)總數(shù)有 11 個(gè)!
作為一個(gè)字符串輸出所有參數(shù) 1 2 3 4 5 6 7 8 9 34 73 !
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抚恒,一起剝皮案震驚了整個(gè)濱河市咱台,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俭驮,老刑警劉巖回溺,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異混萝,居然都是意外死亡遗遵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門逸嘀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來车要,“玉大人,你說我怎么就攤上這事崭倘⊥捅模” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵绳姨,是天一觀的道長(zhǎng)登澜。 經(jīng)常有香客問我,道長(zhǎng)飘庄,這世上最難降的妖魔是什么脑蠕? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上谴仙,老公的妹妹穿的比我還像新娘迂求。我一直安慰自己,他們只是感情好晃跺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布揩局。 她就那樣靜靜地躺著,像睡著了一般掀虎。 火紅的嫁衣襯著肌膚如雪凌盯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天烹玉,我揣著相機(jī)與錄音驰怎,去河邊找鬼。 笑死二打,一個(gè)胖子當(dāng)著我的面吹牛县忌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播继效,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼症杏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了瑞信?” 一聲冷哼從身側(cè)響起鸳慈,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喧伞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绩郎,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潘鲫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肋杖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溉仑。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖状植,靈堂內(nèi)的尸體忽然破棺而出浊竟,到底是詐尸還是另有隱情,我是刑警寧澤津畸,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布振定,位于F島的核電站,受9級(jí)特大地震影響肉拓,放射性物質(zhì)發(fā)生泄漏后频。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卑惜。 院中可真熱鬧膏执,春花似錦、人聲如沸露久。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毫痕。三九已至征峦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镇草,已是汗流浹背眶痰。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梯啤,地道東北人竖伯。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像因宇,于是被迫代替她去往敵國和親七婴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,381評(píng)論 0 5
  • 一察滑、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,745評(píng)論 0 10
  • 菜鳥教程shell在線編輯器大目錄整理: 1.第一個(gè) Shell 腳本嘗試 2.Shell 變量 3.Shell ...
    中酷男閱讀 5,642評(píng)論 0 12
  • 一打厘,shell題記 不懂shell的程序員不是好程序員,學(xué)習(xí)shell是為了自動(dòng)化户盯,使用自動(dòng)化可以非常有效的提高工...
    架構(gòu)師小秘圈閱讀 8,725評(píng)論 3 70
  • 1 我有一個(gè)夢(mèng)想饲化,長(zhǎng)大做一個(gè)科學(xué)家,在寬闊的實(shí)驗(yàn)室里研究迄今為止人類還不知道的秘密——...
    朱田浩楠閱讀 786評(píng)論 1 1