shell編程基礎

shell名詞解釋

  • Kernel:Linux內核,主要是為了和硬件打交道
  • shell: 是一個命令行解釋器,接收用戶命令/應用程序,然後調用操作系統內核。還是一個程序設計語言。
  • 查看當前shell解釋器和系統支持的shell解釋器(我這裡用的是centos7的鏡像)
  • shell的兩大主流
    1. sh:
      Bourne shell(sh),Solaris,hpux默認shell
      Bourne again shell(bash),linux系統默認shell
    2. bash
      C shell(csh)
      tc shell(tcsh)

在Linux系統中,sh是bash的一個軟鏈接(軟鏈接又叫符號鏈接,這個文件包含了另一個文件的路徑名。可以是任意文件或目錄,可以鏈接不同文件系統的文件。)

#!聲明
告訴系統其後路徑所指定的程序是解釋此腳本文件的shell程序,也就是指定shell解釋器bash,路徑是/bin/bash

shell腳本的執行

  1. 輸入腳本的絕對路徑或者相對路徑

shell腳本文件的後綴是sh,這裡使用vim創建並編輯內容後使用絕對路徑執行helloword這個腳本沒有權限,更改權限後使用絕對路徑和相對路徑都可以執行

  1. bash或sh+腳本的絕對路徑或相對路徑
    注意:當腳本沒有x(執行)權限時,root和文件所屬用戶通過這個方式可以正常執行

我這裡已經將權限改成了不可執行,但是通過這個方式依然可以執行

  1. source+腳本的絕對路徑或相對路徑

查看正在執行的進程
ps -ef

三種執行方式的區別
第一種和第二種在用bash解釋器執行腳本時,會先生成一個新的bash,在新的bash中執行
第三種就是在一個bash中執行的,在後面的局部變量中也會體現

shell變量

  • 定義變量時,變量名不加$符號
  • 命名只能用英文字母,數字和下劃線,首個字符不能以數字開頭
  • 中間不能有空格,不能使用標點符號
  • 不能使用bash裏面的關鍵字(可以用help命令查看)

變量的類型

  • 局部變量
    局部變量在腳本或命令中定義,僅僅只在當前shell實例中有效,其他shell啟動的程序不能訪問局部變量
  • 環境變量
    所有的程序,包括shell啟動的程序,都能訪問環境變量,有些程序需要環境變量來保證其正常運行

我在shell中定義了一個局部變量name,使用sh調用腳本,在腳本中打印這個局部變量沒有顯示,但是在腳本中定義的局部變量age卻打印出來了,後面我使用export (作用是可以將當前進程的變量傳遞給子進程去使用)將局部變量name變成了環境變量,這時就可以打印了,造成這種情況的原因是因為前面sh調用腳本時,會先生成一個新的bash,在新的bash裏面執行,此時我們在外面用命令定義的局部變量和bash執行的腳本不在同一個bash內,自然是打印不出來的,在當前shell是可以打印的。
[root@master01 scripts]# echo “${name}”
bfy

刪除變量
unset

shell的字符串
字符串可以用單引號,也可以用雙引號,也可以不用引號
注意:

  1. 單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的
  2. 單引號字符串中不能出現單獨一個單引號,可以成對出現,作為字符串的拼接使用
  3. 雙引號里可以有變量
  4. 雙引號里可以出現轉義字符

這裡的:<<!

  !
  是多行注釋,使用時不局限於感嘆號,EOF也可以,甚至是你自定義的字符
  在雙引號中使用換行符時,需要加上-e

字符串長度


這裡的#是取字符串長度,因為定義變量的時候不能取標點符號,所以沒有打印
1:4是指從1開始,去四個字符,字符串是從0開始的

shell數組
bash支持一維數組,不支持多維數組,並且沒有限定數組的大小
數組的下標從0開始,格式上與Java數組有所不同

shell參數傳遞
執行shell腳本時,向腳本傳遞參數,腳本內獲得參數的格式為:$n n代表一個數字


這裡前9個參數都正常,從第10個開始就發生了變化,原因是$10被默認成了$1拼接上一個0,也就是110。解決辦法是給10用大括號括起來。

shell運算符
運算符的分類
算術運算符

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

(1)\(((運算式))或\)[運算式]
(2)expr + , – , \*, /, % 加,減,乘,除,取余
注意:expr運算符間要有空格
代碼:

關係運算符

= 字符串比較
-lt 小於(less than) -le 小於等於(less equal)
-eq 等於(equal) -gt 大於(greater than)
-ge 大於等於(greater equal) -ne 不等於(Not equal)

關係運算符只支持數字,不支持字符串,除非字符串的值是數字

布爾運算符

字符串運算符

(shell的echo指令用於字符串的輸出,詳情可以看我上一篇博客)

shell流程控制
if判斷
if [ 條件判斷式 ];then
程序
fi
或者
if [ 條件判斷式 ]
then
程序
elif[ 條件判斷式 ]
then
程序
fi
注意事項:
(1)[ 條件判斷式 ],中括號和條件判斷式之間必須有空格
(2)if後要有空格

read 讀取控制台輸入
read(選項)(參數)
選項:
-p:指定讀取值時的提示符;
-t:指定讀取值時等待的時間(秒)。
參數
變量:指定讀取值的變量名

case語句
case $變量名 in
「值1」)
如果變量的值等於值1,則執行程序1
;;
「值2」)
如果變量的值等於值2,則執行程序2
;;
…省略其他分支…

如果變量的值都不是以上的值,則執行此程序
;;
esac
注意事項:
1)case行尾必須為單詞「in」,每一個模式匹配必須以右括號「)」結束。
2)雙分號「;;」表示命令序列結束,相當於java中的break。
3)最後的「
)」表示默認模式,相當於java中的default。

for循環

for (( 初始值;循環控制條件;變量變化 ))
do
代碼
done

while循環
while [ 條件判斷式 ]
do
程序
done

break命令終止執行後面的所有循環
continue命令不會跳出所有循環,僅僅跳出當前循環

shell函數

linux shell 可以用戶定義函數,然後在shell腳本中可以隨便調用。

可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數。

參數返回,可以顯示加:return 返回,如果不加,將以最後一條命令運行結果,作為返回值。return後跟數值n(0-255)

Tags: