1. 程式人生 > >Linux Shell指令碼(一)

Linux Shell指令碼(一)

一、shell指令碼簡介

        Shell 是一個用 C 語言編寫的程式,它是使用者使用 Linux 的橋樑。Shell 既是一種命令語言,又是一種程式設計語言。Shell 是指一種應用程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心的服務。業界所說的 shell 通常都是指 shell 指令碼,但讀者朋友要知道,shell 和 shell script 是兩個不同的概念。由於習慣的原因,簡潔起見,本文出現的 "shell程式設計" 都是指 shell 指令碼程式設計,不是指開發 shell 自身。

        本教程關注的是 Bash,也就是 Bourne Again Shell,由於易用和免費,Bash 在日常工作中被廣泛使用。同時,Bash 也是大多數Linux 系統預設的 Shell。在一般情況下,人們並不區分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh

,它同樣也可以改為 #!/bin/bash#! 告訴系統其後路徑所指定的程式即是解釋此指令碼檔案的 Shell 程式。此外,shell種類可以執行上網搜尋,這裡不做闡述。

二、shell指令碼基礎知識

1、編寫注意事項:

  • 一定以#!/bin/bash開頭
  • shell指令碼是以.sh結尾的檔案。
  • 執行方式為sh 檔名 或者 ./檔名  (注意:檔名為當前路徑下或者絕對路徑的檔名)。
  • 案例:
shell指令碼(完整路徑/home/test.sh)

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

執行方式
sh /home/test.sh
或者
cd /home
./test.sh

2、變數和傳參

url="https://blog.csdn.net/huanyuminhao/article/details/80312320"
  • shell變數不需要定義變數型別;不能使用關鍵字;命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭;中間不能有空格,可以使用下劃線(_);不能使用標點符號。特別注意,變數名和等號之間不能有空格。
#可加可不加
echo $url
echo ${url}
#必須加
echo "this is url:${url}"
  • 變數的使用只需要在前面加上$符號,至於大括號建議加上,如果變數不和字串一起使用可以不加,但是和字串一起使用這必須加大括號進行區分。
#變數只讀
readonly url
#刪除變數
unset url
#變數型別
分為區域性變數、環境變數、 shell變數(不做贅述,上網可搜)
  • Shell 字串可使用單引號或者雙引號,區別就是
    單引號裡的任何字元都會原樣輸出,單引號字串中的變數是無效的;單引號字串中不能出現單引號(對單引號使用轉義符後也不行)。雙引號裡可以有變數;雙引號裡可以出現轉義字元。

#拼接字串
your_name="lisi"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
#獲取字串長度
echo ${#url}
#提取子字串
echo ${url:1:4}
#查詢子字串
echo `expr index "$url" www`
  • Shell 陣列。bash支援一維陣列(不支援多維陣列),並且沒有限定陣列的大小。類似與C語言,陣列元素的下標由0開始編號。獲取陣列中的元素要利用下標,下標可以是整數或算術表示式,其值應大於或等於0。用括號來表示陣列,陣列元素用"空格"符號分割開。

    #定義陣列
    array_name=(value0 value1 value2 value3)
    #讀取陣列
    ${陣列名[下標]}
    #獲取陣列的長度
    length=${#array_name[@]}
    # 或者
    length=${#array_name[*]}
    # 取得陣列單個元素的長度
    lengthn=${#array_name[n]}
  • Shell 註釋。以"#"開頭的行就是註釋,會被直譯器忽略。如果在開發過程中,遇到大段的程式碼需要臨時註釋起來,過一會兒又取消註釋,怎麼辦呢?每一行加個#符號太費力了,可以把這一段要註釋的程式碼用一對花括號括起來,定義成一個函式,沒有地方呼叫這個函式,這塊程式碼就不會執行,達到了和註釋一樣的效果。

  • Shell 傳遞引數。我們可以在執行 Shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為:$nn 代表一個數字,1 為執行指令碼的第一個引數,2 為執行指令碼的第二個引數,以此類推。。。

$* 與 [email protected] 區別:

  • 相同點:都是引用所有引數。
  • 不同點:只有在雙引號中體現出來。假設在指令碼執行時寫了三個引數 1、2、3,,則 " * " 等價於 "1 2 3"(傳遞了一個引數),而 "@" 等價於 "1" "2" "3"(傳遞了三個引數)。

3、Shell 基本運算子

4、輸出命令
  • echo命令,一般一個echo命令就是輸出一行(自動換行),可省略引號,可顯示轉義字元,換行處理需要在輸出尾部加"\n"。
  • printf 命令,printf 使用引用文字或空格分隔的引數,外面可以在 printf 中使用格式化字串,還可以制定字串的寬度、左右對齊方式等。預設 printf 不會像 echo 自動新增換行符,我們可以手動新增 \n。
        printf  format-string  [arguments...]
  • 引數說明:   
format-string: 為格式控制字串 arguments: 為引數列表。

5、Shell test 命令

  • num1=100
    num2=100
    if test $[num1] -eq $[num2]
    then
        echo '兩個數相等!'
    else
        echo '兩個數不相等!'
    fi

6、Shell 流程控制

  • sh的流程控制不可為空。語句寫成一行需要使用分號";"分隔。if語句必須以fi結尾,if與判斷條件中間有一個空格。無限迴圈的條件是冒號":"或者true。只限於while語句。
  • until 迴圈與 while 迴圈在處理方式上剛好相反。一般 while 迴圈優於 until 迴圈,但在某些時候—也只是極少數情況下,until 迴圈更加有用。
#if else 語法格式:
if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

#for 迴圈
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

#while 語句
while condition
do
    command
done

#until 迴圈
until condition
do
    command
done

7、shell函式

  • 函式引數在函式呼叫的時候使用空格分隔開,獲取第十個引數需要${10}。當n>=10時,需要使用${n}來獲取引數。
[ function ] funname [()]
{
    action;
    [return int;]
}

8、Shell 檔案包含

  • 和其他語言一樣,Shell 也可以包含外部指令碼。這樣可以很方便的封裝一些公用的程式碼作為一個獨立的檔案。
  • . filename   # 注意點號(.)和檔名中間有一空格
    或
    source filename

9、Shell 輸入/輸出重定向

  • 檔案輸入輸出由追蹤為一個給定的程序所有開啟檔案的整數控制代碼來完成。這些數字值就是檔案描述符。最為人們所知的檔案米描述符是 stdin, stdout 和 stderr,檔案描述符的數字分別是0,1和2。這些數字和各自的裝置是保留的。一個命令執行前,先會準備好所有輸入輸出,預設分別繫結(stdin,stdout,stderr),如果這個時候出現錯誤,命令將終止,不會執行。
  • shell輸出重定向。
  1. shell輸出重定向預設輸出到螢幕中,使用">"或者">>"進行輸出到檔案、其他裝置中。區別是">>"為在輸出物件結果進行新增,">"為直接覆蓋原輸出物件。
  2. 標準輸出 (stdout):程式碼為 1 ,使用 > 或 >> ; /dev/stdout -> /proc/self/fd/1 1代表:/dev/stdout
  3. 標準錯誤輸出(stderr):程式碼為 2 ,使用 2> 或 2>> ; /dev/stderr -> /proc/self/fd/2 2代表:/dev/stderr
  4. 格式: 
    command-line1 [1-n] > file或檔案操作符或裝置 
    解釋:將一條命令執行結果(標準輸出,或者錯誤輸出,本來都要列印到螢幕上面的) 重定向其它輸出裝置(檔案,開啟檔案操作符,或印表機等等)1,2分別是標準輸出,錯誤輸出。 
#顯示當前目錄檔案 test.sh test1.sh test1.sh實際不存在 
[[email protected] sh]# ls test.sh test1.sh 
ls: 無法訪問test1.sh: 沒有那個檔案或目錄
test.sh

#正確輸出與錯誤輸出都顯示在螢幕了,現在需要把正確輸出寫入file
# 1可以省略,不寫,預設所至標準輸出
[[email protected] sh]# ls test.sh test1.sh 1>file
ls: 無法訪問test1.sh: 沒有那個檔案或目錄
[[email protected] sh]# cat file 
test.sh

#把錯誤輸出,不輸出到螢幕,輸出到error,並再次追加輸出
[[email protected] sh]# ls test.sh test1.sh 1>file 2>error
[[email protected] sh]# cat error 
ls: 無法訪問test1.sh: 沒有那個檔案或目錄
[[email protected] sh]# ls test.sh test1.sh 1>file 2>>error
[[email protected] sh]# cat error 
ls: 無法訪問test1.sh: 沒有那個檔案或目錄
ls: 無法訪問test1.sh: 沒有那個檔案或目錄

#將錯誤輸出資訊關閉掉,其中關閉正確輸出會報錯
[[email protected] sh]# ls test.sh test1.sh 1>&-
ls: 無法訪問test1.sh: 沒有那個檔案或目錄
ls: 寫入錯誤: 錯誤的檔案描述符
[[email protected] sh]# ls test.sh test1.sh 2>&-
test.sh

#/dev/null 這個裝置,是linux 中黑洞裝置,什麼資訊只要輸出給這個裝置,都會給吃掉
[[email protected] sh]# ls test.sh test1.sh 2>/dev/null
test.sh

#將錯誤輸出2 繫結給 正確輸出 1,然後將 正確輸出 傳送給 /dev/null裝置 這種常用。注意前後順序的問題,不然報錯。
[[email protected] sh]# ls test.sh test1.sh 2>&11>/dev/null
bash: 11: 錯誤的檔案描述符
[[email protected] sh]# ls test.sh test1.sh 1>/dev/null 2>&1
  • shell輸入重定向
  1. 格式: 
    command-line [n] <file或檔案描述符&裝置 
    解釋:將然有,命令預設從鍵盤獲得的輸入,改成從檔案,或者其它開啟檔案以及裝置輸入。執行這個命令,將標準輸入0,與檔案或裝置繫結。將由它進行輸入。
#從標準輸入【鍵盤】獲得資料,然後輸出給file檔案
[[email protected] sh]# cat >file
admin
you
me
#這裡按下 [ctrl]+d 離開 
[[email protected] sh]# cat file 
admin
you
me

#cat 從test.sh 獲得輸入資料,然後輸出給檔案file
[[email protected] sh]# cat >file <test.sh 
[[email protected] sh]# cat file 
#!/bin/bash

#<< 這個連續兩個小符號, 他代表的是『結束的輸入字元』的意思。這樣當空行輸入eof字元,輸入自動結束,不用ctrl+D,其中EOF可以使用其他字元替換
[[email protected] sh]# cat >file <<EOF
> me and you
> EOF

相關推薦

Linux Shell指令碼

一、shell指令碼簡介        Shell 是一個用 C 語言編寫的程式,它是使用者使用 Linux 的橋樑。Shell 既是一種命令語言,又是一種程式設計語言。Shell 是指一種應用程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心的服務。業界所

Linux shell 示例

echo -e linu 定義變量 cheng lee export let linux amd 一、環境系統:Centos6.6 x64shell:bash、sh [centos@Shell ~]$ hostname Shell [centos@Shell ~]$ ls

Linux Shell命令簡介 變數

shell簡介 Shell本身是一個用C語言編寫的程式,它是使用者使用Unix/Linux的橋樑,使用者的大部分工作都是通過Shell完成的。Shell既是一種命令語言,又是一種程式設計語言。作為命令語言,它互動式地解釋和執行使用者輸入的命令;作為程式設計語言,它定義了各種變數和引數,並提供了

如何編寫一個優雅的Shell指令碼

簡介    shell指令碼是用各類命令預先放入到一個檔案中,方便一次性執行的一個程式檔案,本文簡述如何編寫一個優雅的shell指令碼。 使用技術介紹 eval命令    可以將一個字串當作一個命令執行。    CMD="ls -ltr" eval $CMD 內建

Linux shell 基礎,自己慢慢步步學

Linux shell指令碼基礎學習這裡我們先來第一講,介紹shell的語法基礎,開頭、註釋、變數和 環境變數,向大家做一個基礎的介紹,雖然不涉及具體東西,但是打好基礎是以後學習輕鬆地前提。 1. Linux 指令碼編寫基礎 ◆1.1 語法基本介紹1.1.1 開頭 程式必須

書寫優雅的shell指令碼- if語句

[ -d 檔案 ] 為真 如果 檔案 存在 而且 是一個 目錄。[ -e 檔案 ] 為真 如果 檔案 存在。[ -f 檔案 ] 為真 如果 檔案 存在 而且 是一個 普通 檔案。[ -g 檔案 ] 為真 如果 檔案 存在 而且 已經設定了他的 SGID 位。[ -h 檔案 ] 為真 如果 檔案 存在 而且 是

Linux Shell 程式設計

從程式設計師的角度來看, Shell本身是一種用C語言編寫的程式,從使用者的角度來看,Shell是使用者與Linux作業系統溝通的橋樑。使用者既可以輸入命令執行,又可以利用 Shell指令碼程式設計,完成更加複雜的操作。在Linux GUI日益完善的今天,在系統管理等領域

Linux系統 shell基礎編輯中

初始 輸入 分享 用戶命令 解釋器 sts ima 理解 操作 shell是操作系統中重要的應用,尤其對linux這種命令行模式的操作系統,shell具有重要的意義。 一、什麽是shell shell是一個命令解釋器,提供用戶和機器之間的交互。每次我們登錄系統後,出現的界面

Shell入門Shell指令碼、環境

Shell 教程 Shell 是一個用C語言編寫的程式,它是使用者使用Linux的橋樑。Shell既是一種命令語言,又是一種程式設計語言。 Shell 是指一種應用程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心的服務。 Shell 指令碼 Shell

Linux基礎--shell指令碼1

shell程式設計:      主要指令碼維護,用於偵聽使用者輸入指令,接受到這些指令,執行相應操作。     指令可以執行,靠的是shell環境變數     設定環境變數  &nbs

Linux基礎--shell指令碼5

================================ while 迴圈          init     while [ con ]     do  &n

Linux基礎--shell指令碼4

判斷語句     格式五     if [ con1 ]     then         cmd1     elif

Linux基礎--shell指令碼3

選擇結構     格式一:         if [ con ]         then      &nb

Linux基礎--shell指令碼2

實現shell指令碼     1 建立指令碼檔案         touch file.sh     2 實現指令碼       

linux學習筆記之shell程式設計

shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則

linux學習筆記之shell程式設計正則表示式與字元處理

shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則表示式常用的字元(注意區別於萬用字元裡面的符號)#### -*

Linux 學習筆記Shell

一.Shell概念 Shell俗稱殼,是指“為使用者提供操作介面”的軟體(命令解析器)。它類似於DOS下的command.com和windows的cmd.exe。 作用:它接收使用者命令,然後呼叫相應的應用程式。即互動式解釋和執行使用者輸入的命令或者自動地解釋和執行預先設

Linux系統下製作服務啟動指令碼

在Linux系統中經常會用到類似service mysql start、service tomcat restart等這樣的命令,並且這些命令在任務路徑下都可以執行,這是怎麼做到的呢?要弄明白這個問題,首先需要知道Linux系統中的一個目錄/etc/init.d,要弄明白這個目錄的作用,在Lin

Linux shell 基礎,自己慢慢步步學

4)函式 如果您寫了一些稍微複雜一些的程式,您就會發現在程式中可能在幾個地方使用了相同的程式碼,並且您也會發現,如果我們使用了函式,會方便很多。一個函式是這個樣子的: functionname() { # inside the body $1 is the first ar

Linux shell 基礎,自己慢慢步步學

Linux shell指令碼基礎已經被分成好幾個部分了,這裡對控制流程的內容也就馬上講完了,這是最後一部分關於here document,這裡舉例稍微有點複雜,我們慢慢來分析這個複雜Linux shell指令碼。 6. Here documents 當要將幾行文字傳遞給一個