Linux之Shell腳本編程(一)


一、什么是shell

????????Shell是命令解釋器(command interpreter),是Unix操作系統(tǒng)的用戶接口,程序從用戶接口得到輸入信息,shell將用戶程序及其輸入翻譯成操作系統(tǒng)內(nèi)核(kernel)能夠識(shí)別的指令,并且操作系統(tǒng)內(nèi)核執(zhí)行完將返回的輸出通過(guò)shell再呈現(xiàn)給用戶,下圖所示用戶、shell和操作系統(tǒng)的關(guān)系:


image.png

  Shell也是一門(mén)編程語(yǔ)言,即shell腳本,shell是解釋執(zhí)行的腳本語(yǔ)言,可直接調(diào)用linux命令。 .java -> .class
  一個(gè)系統(tǒng)可以存在多個(gè)shell,可以通過(guò)cat /etc/shells命令查看系統(tǒng)中安裝的shell,不同的shell可能支持的命令語(yǔ)法是不相同的。

二、shell的種類

????????操作系統(tǒng)內(nèi)核(kernel)與shell是獨(dú)立的套件,而且都可被替換。不同的操作系統(tǒng)使用不同的shell;同一個(gè)kernel之上可以使用不同的shell。
  常見(jiàn)的shell分為兩大主流:
  sh:
    Bourne shell(sh) ,Solaris,hpux默認(rèn)shell
    Bourne again shell(bash) ,Linux系統(tǒng)默認(rèn)shell
  csh:
    C shell(csh)
    tc shell(tcsh)
  查看shell:

image.png

三、shell環(huán)境定義

臨時(shí)環(huán)境變量

????????所謂臨時(shí)變量是指在用戶在當(dāng)前登陸環(huán)境生效的變量,用戶登陸系統(tǒng)后,直接在命令行上定義的環(huán)境變量便只能在當(dāng)前的登陸環(huán)境中使用。當(dāng)退出系統(tǒng)后,環(huán)境變量將不能下次登陸時(shí)繼續(xù)使用。

將環(huán)境變量永久生效

????????通過(guò)將環(huán)境變量定義寫(xiě)入到配置文件中,用戶每次登陸時(shí)系統(tǒng)自動(dòng)定義,則無(wú)需再到命令行重新定義。定義環(huán)境變量的常見(jiàn)配置文件如下:
  /etc/profile: 針對(duì)系統(tǒng)所有用戶生效,此文件應(yīng)用于所有用戶每次登陸系統(tǒng)時(shí)的環(huán)境變量定義
  $HOME_name/.bash_profile: 針對(duì)特定用戶生效,$HOME為用戶的宿主目錄,當(dāng)用戶登陸系統(tǒng)后,首先繼承/etc/profile文件中的定義,再應(yīng)用$HOME/.bash_profile文件中的定義。

系統(tǒng)預(yù)定義的環(huán)境變量

????????系統(tǒng)環(huán)境變量對(duì)所有用戶有效,如:PATH、HOME、SHELL、PWD等等,如下用echo命令打印上述的系統(tǒng)環(huán)境變量:


image.png

四、shell腳本編程

????????同傳統(tǒng)的編程語(yǔ)言一樣,shell提供了很多特性,這些特性可以使你的shell腳本編程更為有用。

創(chuàng)建Shell腳本

一個(gè)shell腳本通常包含如下部分:
  首行
    第一行內(nèi)容在腳本的首行左側(cè),表示腳本將要調(diào)用的shell解釋器,內(nèi)容如下:
    #!/bin/bash
    #!符號(hào)能夠被內(nèi)核識(shí)別成是一個(gè)腳本的開(kāi)始,這一行必須位于腳本的首行,/bin/bash是bash程序的絕對(duì)路徑,在這里表示后續(xù)的內(nèi)容將通過(guò)bash程序解釋執(zhí)行。
  注釋
    注釋符號(hào)# 放在需注釋內(nèi)容的前面
  內(nèi)容
    下面是一個(gè)可執(zhí)行的shell腳本的結(jié)構(gòu),如下:

image.png

Shell腳本的權(quán)限

????????一般情況下,默認(rèn)創(chuàng)建的腳本是沒(méi)有執(zhí)行權(quán)限的。


image.png

????????沒(méi)有權(quán)限不能執(zhí)行,需要賦予可執(zhí)行權(quán)限。


image.png
Shell腳本的執(zhí)行

????????1,輸入腳本的絕對(duì)路徑或相對(duì)路徑
    /root/shell/test.sh
    ./test.sh

image.png

2,bash或sh +腳本
    bash /root/shell/test2.sh
    sh test2.sh
    注:當(dāng)腳本沒(méi)有x權(quán)限時(shí),root和文件所有者通過(guò)該方式可以正常執(zhí)行。

image.png

   3,在腳本的路徑前再加". " 或source
    source /root/helloWorld.sh
    . ./helloWorld.sh
    區(qū)別:1、第一種和第二種會(huì)新開(kāi)一個(gè)bash,不同bash中的變量無(wú)法共享。
       2、但是使用. ./腳本source 這種方式是在同一個(gè)shell里面執(zhí)行的。

image.png

五、shell變量

????????變量:是shell傳遞數(shù)據(jù)的一種方式,用來(lái)代表每個(gè)取值的符號(hào)名。當(dāng)shell腳本需要保存一些信息時(shí),如一個(gè)文件名或是一個(gè)數(shù)字,就把它存放在一個(gè)變量中。
????????變量設(shè)置規(guī)則:
    1,變量名稱可以由字母,數(shù)字和下劃線組成,但是不能以數(shù)字開(kāi)頭,環(huán)境變量名建議大寫(xiě),便于區(qū)分。
    2,在bash中,變量的默認(rèn)類型都是字符串型,如果要進(jìn)行數(shù)值運(yùn)算,則必須指定變量類型為數(shù)值型。
    3,變量用等號(hào)連接值,等號(hào)左右兩側(cè)不能有空格。
    4,變量的值如果有空格,需要使用單引號(hào)或者雙引號(hào)包括。
????????變量分類:
  Linux Shell中的變量分為用戶自定義變量,環(huán)境變量,位置參數(shù)變量和預(yù)定義變量??梢酝ㄟ^(guò)set命令查看系統(tǒng)中存在的所有變量。
    系統(tǒng)變量:保存和系統(tǒng)操作環(huán)境相關(guān)的數(shù)據(jù)。HOME、PWD、SHELL、USER等等
    位置參數(shù)變量:主要用來(lái)向腳本中傳遞參數(shù)或數(shù)據(jù),變量名不能自定義,變量作用固定。
    預(yù)定義變量:是Bash中已經(jīng)定義好的變量,變量名不能自定義,變量作用也是固定的。

用戶自定義變量

????????用戶自定義的變量由字母或下劃線開(kāi)頭,由字母,數(shù)字或下劃線序列組成,并且大小寫(xiě)字母意義不同,變量名長(zhǎng)度沒(méi)有限制。
????????設(shè)置變量
    習(xí)慣上用大寫(xiě)字母來(lái)命名變量。變量名以字母表示的字符開(kāi)頭,不能用數(shù)字。
????????變量調(diào)用
    在使用變量時(shí),要在變量名前加上前綴“$”.
    使用echo 命令查看變量值。eg:echo $A
????????變量賦值
    1,定義時(shí)賦值:
    變量=值 等號(hào)兩側(cè)不能有空格
    eg:
      STR="hello world"
      A=9
    2, 將一個(gè)命令的執(zhí)行結(jié)果賦給變量
      A=`ls -la` 反引號(hào),運(yùn)行里面的命令,并把結(jié)果返回給變量A
      A=$(ls -la) 等價(jià)于反引號(hào)
      eg: aa=$((4+5))
        bb=`expr 4 + 5 `
    3,將一個(gè)變量賦給另一個(gè)變量
      eg : A=$STR
????????變量疊加
    eg: #aa=123
    eg: #cc="$aa"456
    eg: #dd=${aa}789

??????????????單引號(hào)和雙引號(hào)的區(qū)別:
      現(xiàn)象:?jiǎn)我?hào)里的內(nèi)容會(huì)全部輸出,而雙引號(hào)里的內(nèi)容會(huì)有變化
      原因:?jiǎn)我?hào)會(huì)將所有特殊字符脫意

????????列出所有的變量
    set

????????刪除變量
    unset NAME
    eg :
      # unset A 撤銷變量 A
      # readonly B=2 聲明靜態(tài)的變量 B=2 ,不能 unset
????????用戶自定義的變量,作用域?yàn)楫?dāng)前的shell環(huán)境。

環(huán)境變量

????????用戶自定義變量只在當(dāng)前的shell中生效,而環(huán)境變量會(huì)在當(dāng)前shell和其所有子shell中生效。如果把環(huán)境變量寫(xiě)入相應(yīng)的配置文件,那么這個(gè)環(huán)境變量就會(huì)在所有的shell中生效。

????????export 變量名=變量值 申明變量
   作用域:當(dāng)前shell以及所有的子shell。

位置參數(shù)變量

????????在 Linux 的命令行中,當(dāng)一條命令或腳本執(zhí)行時(shí),后面可以跟多個(gè)參數(shù),我們使用位置參數(shù)變量來(lái)表示這些參數(shù)。
   其中,$0 代表命令行本身,$1 代表第 1 個(gè)參數(shù),$2 代表第 2 個(gè)參數(shù),依次類推。當(dāng)參數(shù)個(gè)數(shù)超過(guò) 10 個(gè)時(shí),就要用大括號(hào)把這個(gè)數(shù)字括起來(lái),例如,${10} 代表第 10 個(gè)參數(shù),${14} 則代表第 14 個(gè)參數(shù)。舉個(gè)例子:
   [root@localhost ~]# ls anaconda-ks.cfg install.log install.log.syslog
   如果執(zhí)行這樣一條命令,則 $0 的值就是 ls 命令本身,$1 的值就是 anaconda-ks.cfg 這個(gè)文件,$2 是 install.log 文件,$3 是 install.log.syslog 文件。

????????在 Shell 中可以識(shí)別的位置參數(shù)變量如表 1 所示。

image.png

   [1] 位置參數(shù)變量要用于向命令或程序腳本中傳遞信息,比如,我們想要寫(xiě)一個(gè)計(jì)算器,要告訴程序應(yīng)該運(yùn)算哪個(gè)字符,這時(shí)就需要通過(guò)位置參數(shù)變量向腳本中傳遞數(shù)值,命令如下:
image.png

   [2] $、 $@ 、 $#的作用,以下面的例子介紹:
image.png

   [3] $
和$@ 的區(qū)別,以下面的例子介紹:
image.png

預(yù)定義變量
image.png

參考鏈接
https://www.cnblogs.com/zhangchao162/p/9614145.html

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

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