shell編程基礎(chǔ)

1. shell腳本:

包含一些命令或聲明,并符合一定格式的文本文件

  • ? 格式要求:首行shebang(#!)機(jī)制
    #英文為SHARP
    #!/bin/bash
    #!/usr/bin/python
    #!/usr/bin/perl
  • ? shell腳本的用途有:
    ? 自動化常用命令
    ? 執(zhí)行系統(tǒng)管理和故障排除
    ? 創(chuàng)建簡單的應(yīng)用程序
    ? 處理文本或文件

2.創(chuàng)建shell腳本

  • 第一步:使用文本編輯器來創(chuàng)建文本文件
    ? 第一行必須包括shell聲明序列:#!
    eg: #!/bin/bash
    ? 添加注釋
    注釋以#開頭
  • 第二步:運行腳本
    ? 給予執(zhí)行權(quán)限,在命令行上指定腳本的絕對或相對路徑
    ? 直接運行解釋器,將腳本作為解釋器程序的參數(shù)運行(沒有執(zhí)行權(quán)限)
    一般腳本后綴以.sh結(jié)尾
    eg: bash /hello.sh
    source /hello.sh(會影響環(huán)境,配置文件用,腳本一般不用,source不會開子進(jìn)程)
Paste_Image.png

3.腳本規(guī)范

腳本代碼開頭約定
1、第一行一般為調(diào)用使用的語言
2、程序名,避免更改文件名為無法找到正確的文件
3、版本號
4、更改后的時間
5、作者相關(guān)信息
6、該程序的作用,及注意事項
7、最后是各版本的更新簡要說明

Paste_Image.png

4.腳本的基本結(jié)構(gòu)

#!SHEBANG
CONFIGURATION_VARIABLES(配置環(huán)境變量)
FUNCTION_DEFINITIONS(函數(shù)定義)
MAIN_CODE(代碼)

Paste_Image.png

運行結(jié)果:


Paste_Image.png

5.腳本調(diào)試

  • 檢測腳本中的語法錯誤(組織程序后期執(zhí)行)
    bash -n /path/to/some_script
  • 調(diào)試執(zhí)行
    bash -x /path/to/some_script(-x跟蹤執(zhí)行的過程,排錯)

6.變量

弱類型:語言的運行時會隱式做數(shù)據(jù)類型轉(zhuǎn)換。無須指定類
型,默認(rèn)均為字符型;參與運算會自動進(jìn)行隱式類型轉(zhuǎn)換;
變量無須事先定義可直接調(diào)用

如:bash 不支持浮點數(shù),php

  • 變量命名法則:
    1、不能使程序中的保留字:例如if, for
    2、只能使用數(shù)字、字母及下劃線,且不能以數(shù)字開頭
    3、見名知義
    4、統(tǒng)一命名規(guī)則:駝峰命名法
    5、腳本中不使用別名

7.bash中變量的種類

  • 根據(jù)變量的生效范圍等標(biāo)準(zhǔn):
    @本地變量:生效范圍為當(dāng)前shell進(jìn)程;對當(dāng)前shell之外
    的其它shell進(jìn)程,包括當(dāng)前shell的子shell進(jìn)程均無效
    @環(huán)境變量:生效范圍為當(dāng)前shell進(jìn)程及其子進(jìn)程
    @局部變量:生效范圍為當(dāng)前shell進(jìn)程中某代碼片斷(通常
    指函數(shù))
    @位置變量:$1, $2, ...來表示,用于讓腳本在腳本代碼
    中調(diào)用通過命令行傳遞給它的參數(shù)
    @特殊變量:$?, $0, $*, $@, $#,$$
Paste_Image.png
  • 本地變量
    • 變量賦值:name=‘value’
      可以使用引用value:
      (1) 可以是直接字串; name=“root"
      (2) 變量引用:name="$USER"
      (3) 命令引用:name=`COMMAND` name=$(COMMAND)
      ? 變量引用:${name} $name

"":(雙引號)弱引用,其中的變量引用會被替換為變量值
'':(單引號)強(qiáng)引用,其中的變量引用不會被替換為變量值,而保持原字符串
``:(反向單引號),可以輸出語句
? 顯示已定義的所有變量:set
? 刪除變量:unset name

Paste_Image.png

括號內(nèi)定義的只在小括號里有用

Paste_Image.png
  • 環(huán)境變量
    變量聲明、賦值:
    export name=VALUE
    declare -x name=VALUE
    ? 變量引用:$name, ${name}
    ? 顯示所有環(huán)境變量:
    env
    printenv
    export
    declare -x
    ? 刪除變量:
    unset name
  • 只讀和位置變量
    只讀變量:只能聲明,但不能修改和刪除
    聲明只讀變量:
    readonly name
    declare -r name
    ? 查看只讀變量:
    readonly –p
    ? 位置變量:在腳本代碼中調(diào)用通過命令行傳遞給腳本的參數(shù)
    $1, $2, ...:對應(yīng)第1、第2等參數(shù),shift [n]換位置
    $0: 命令本身
    $*: 傳遞給腳本的所有參數(shù),全部參數(shù)合為一個字符串
    $@: 傳遞給腳本的所有參數(shù),每個參數(shù)為獨立字符串
    $#: 傳遞給腳本的參數(shù)的個數(shù)
    $@ $* 只在被雙引號包起來的時候才會有差異
    set -- 清空所有位置變量
Paste_Image.png

Paste_Image.png

執(zhí)行結(jié)果:

Paste_Image.png
Paste_Image.png
Paste_Image.png
  • 退出狀態(tài)
    ? 進(jìn)程使用退出狀態(tài)來報告成功或失敗
    ? 0 代表成功,1-255代表失敗
    ? $? 變量保存最近的命令退出狀態(tài)
    例如:
    ping -c1 -W1 hostdown &> /dev/null
    echo $?

9.退出狀態(tài)碼

  • bash自定義退出狀態(tài)碼
    exit [n]:自定義退出狀態(tài)碼
    注意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出
    狀態(tài)取決于exit命令后面的數(shù)字
    注意:如果未給腳本指定退出狀態(tài)碼,整個腳本的退出狀態(tài)碼
    取決于腳本中執(zhí)行的最后一條命令的狀態(tài)碼
Paste_Image.png

10.算術(shù)運算

  • bash中的算術(shù)運算:help let
    +, -,*, /, %取模(取余), **(乘方)
    實現(xiàn)算術(shù)運算:
    (1) let var=算術(shù)表達(dá)式
    (2) var=$[算術(shù)表達(dá)式]
    (3) var=$((算術(shù)表達(dá)式)) (( ))相當(dāng)于[ ]
    (4) var=$(expr arg1 arg2 arg3 ...)
    expr是命令,可以判斷數(shù)字是否為整數(shù)
    (5) declare –i var = 數(shù)值(eg:declare -i x=100)
    (6) echo ‘算術(shù)表達(dá)式’ | bc
    ? 乘法符號有些場景中需要轉(zhuǎn)義,如*
    ? bash有內(nèi)建的隨機(jī)數(shù)生成器:$RANDOM(0-32767)
    echo $[$RANDOM%50] :0-49之間隨機(jī)數(shù)
  • 賦值?
    增強(qiáng)型賦值
    +=,
    -=, *=, /=, %=
    ? let varOPERvalue
    例如:let count+=3
    自加
    后自賦值
  • 自增,自減:
    let var+=1
    let var++
    let var
    -=1
    let var--
Paste_Image.png

11.邏輯運算 true, false1, 0

? 與:
1與 1 = 1
1與 0 = 0
0與 1 = 0
0與 0 = 0
(任何數(shù)與0相與都為0)

?或:
1或 1 = 1
1或 0 = 1
0或 1 = 1
0或 0 = 0
(任何數(shù)與1想或都為1)

? 非:!
! 1 = 0
! 0 = 1

? 短路運算
短路與
0第一個為0,結(jié)果必定為0
第一個為1,第二個必須要參與運算
短路或
第一個為1,結(jié)果必定為1
第一個為0,第二個必須要參與運算
? 異或:^
異或的兩個值,相同為假,不同為真

Paste_Image.png

12.條件測試

? 若真,則返回0
? 若假,則返回1
? 測試命令:
? test EXPRESSION
? [ EXPRESSION ]
? [[ EXPRESSION ]]
注意:EXPRESSION前后必須有空白字符

根據(jù)退出狀態(tài)而定,命令可以有條件地運行
? && 代表條件性的AND THEN
? || 代表條件性的OR ELSE
cmd1 && cmd2 || cmd3
cmd1為真,執(zhí)行cmd2,若cmd2為假,執(zhí)行cmd3

13.test命令

內(nèi)置命令

?長格式的例子:
test "$A" == "$B" && echo "Strings are equal"
test “$A” -eq “$B” && echo "Integers are equal"
? 簡寫格式的例子:
[ "$A" == "$B" ] && echo "Strings are equal"
[ "$A" -eq "$B" ] && echo "Integers are equal"

Paste_Image.png

14.bash的數(shù)值測試

? -v VAR 變量VAR是否設(shè)置

數(shù)值測試:
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于

字符串測試:
== 是否等于
> ascii碼是否大于ascii碼
< 是否小于
!= 是否不等于
=~ 左側(cè)字符串是否能夠被右側(cè)的PATTERN所匹配
注意: 此表達(dá)式一般用于[[ ]]中;擴(kuò)展的正則表達(dá)式

Paste_Image.png

-z "STRING“ 字符串是否為空,空為真,不空為假
-n "STRING“ 字符串是否不空,不空為真,空為假
? 注意:用于字符串比較時的用到的操作數(shù)都應(yīng)該使用引號

15.Bash的文件測試

存在性測試
-a FILE:同-e
-e FILE: 文件存在性測試,存在為真,否則為假

?存在性及類別測試(先判斷是否為軟連接)
-b FILE:是否存在且為塊設(shè)備文件
-c FILE:是否存在且為字符設(shè)備文件
-d FILE:是否存在且為目錄文件
-f FILE:是否存在且為普通文件
-h FILE 或 -L FILE:存在且為符號鏈接文件
-p FILE:是否存在且為命名管道文件
-S FILE:是否存在且為套接字文件

Paste_Image.png

文件權(quán)限測試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執(zhí)行
? 文件特殊權(quán)限測試:
-u FILE:是否存在且擁有suid權(quán)限
-g FILE:是否存在且擁有sgid權(quán)限
-k FILE:是否存在且擁有sticky權(quán)限

Paste_Image.png

文件大小測試:
-s FILE: 是否存在且非空

文件是否打開:
-t fd: fd表示文件描述符是否已經(jīng)打開且與某終端相關(guān)
-N FILE:文件自動上一次被讀取之后是否被修改過
-O FILE:當(dāng)前有效用戶是否為文件屬主(大寫O)
-G FILE:當(dāng)前有效用戶是否為文件屬組

Paste_Image.png

雙目測試:
FILE1 -ef FILE2: FILE1與FILE2是否指向同一個設(shè)
備上的相同inode
FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2: FILE1是否舊于FILE2

Paste_Image.png

第一種方式:
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
! COMMAND 非
如:[[ -r FILE ]] && [[ -w FILE ]]
第二種方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必須使用測試命令進(jìn)行
示例:
[ -z “$HOSTNAME” -o $HOSTNAME "==
"localhost.localdomain" ] && hostname www.magedu.com
[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

16.使用read命令來接受輸入

? 使用read來把輸入值分配給一個或多個shell變量
-p 指定要顯示的提示
-s 靜默輸入,一般用于密碼
-n N 指定輸入的字符長度N
-d ‘字符’ 輸入結(jié)束符
-t N TIMEOUT為N秒
read 從標(biāo)準(zhǔn)輸入中讀取值,給每個單詞分配一個變量
所有剩余單詞都被分配給最后一個變量
read -p “Enter a filename: “ FILE

Paste_Image.png
Paste_Image.png

運行結(jié)果:


Paste_Image.png

![Upload Paste_Image.png failed. Please try again.]

bash展開命令行
? 把命令行分成單個命令詞
? 展開別名
? 展開大括號的聲明({})
? 展開波浪符聲明(~)
? 命令替換$() 和 ``)
? 再次把命令行分成命令詞
? 展開文件通配(*
、?、[abc]等等)
? 準(zhǔn)備I/0重導(dǎo)向(<、>)
? 運行命令

防止擴(kuò)展
?反斜線(\)會使隨后的字符按原意解釋
$ echo Your cost: $5.00
Your cost: $5.00
?加引號來防止擴(kuò)展
? 單引號(’)防止所有擴(kuò)展
? 雙引號(”)也防止所有擴(kuò)展,但是以下情況例外:
? $(美元符號) - 變量擴(kuò)展
? `(反引號) - 命令替換
? \(反斜線) - 禁止單個字符擴(kuò)展
? !(嘆號) - 歷史命令替換

bash的配置文件
? 按生效范圍劃分,存在兩類:
? 全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
? 個人配置:
~/.bash_profile
~/.bashrc

17.shell登錄兩種方式

? 交互式登錄:
(1)直接通過終端輸入賬號密碼登錄
(2)使用“su - UserName” 切換的用戶
執(zhí)行順序:/etc/profile --> /etc/profile.d/*.sh -->
~/.bash_profile --> ~/.bashrc --> /etc/bashrc
(如果有沖突的定義,以最后一個為準(zhǔn),之間為調(diào)用關(guān)系)
cat /etc/profile

Paste_Image.png

? 非交互式登錄:
(1)su UserName
(2)圖形界面下打開的終端
(3)執(zhí)行腳本
(4)任何其它的bash實例
執(zhí)行順序: ~/.bashrc --> /etc/bashrc -->
/etc/profile.d/*.sh

18.Profile類和Bashrc類

? profile類:為交互式登錄的shell提供配置
全局:/etc/profile, /etc/profile.d/*.sh
個人:~/.bash_profile
功用:
(1) 用于定義環(huán)境變量
(2) 運行命令或腳本
? bashrc類:為非交互式和交互式登錄的shell提供配置
全局:/etc/bashrc
個人:~/.bashrc
功用:
(1) 定義命令別名和函數(shù)
(2) 定義本地變量
編輯配置文件生效
? 修改profile和bashrc文件后需生效
兩種方法:
1重新啟動shell進(jìn)程
2 . 或source
例:
. ~/.bashrc

Bash 退出任務(wù)
? 保存在~/.bash_logout文件中(用戶)
? 在退出登錄shell時運行
? 用于
? 創(chuàng)建自動備份
? 清除臨時文件

19. $-變量

? h:hashall,打開這個選項后,Shell 會將命令所在的路徑hash下來,避免每次都要查詢。通過set +h將h選項關(guān)閉
? i:interactive-comments,包含這個選項說明當(dāng)前的 shell是一個交互式的 shell。所謂的交互式shell,在腳本中,i選項是關(guān)閉的。
? m:monitor,打開監(jiān)控模式,就可以通過Job control來控制進(jìn)程的停止、繼續(xù),后臺或者前臺執(zhí)行等。
? B:braceexpand,大括號擴(kuò)展
? H:history,H選項打開,可以展開歷史列表中的命令,可以通過!感嘆號來完成,例如“!!”返回上最近的一個歷史命令,“!n”返回第 n 個歷史命令

Paste_Image.png
Paste_Image.png

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,746評論 2 370

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