日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 下shell编程

發布時間:2023/12/9 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 下shell编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 什么是shell?Shell是一個命令解析器,是介于Linux操作系統的內核(kernel)與用戶之間的一個絕緣層。shell腳本就是講各類命令預先放入其中,方便一次性執行的一個程序文件,主要用于方便管理員進行設置或者管理。

?? 序員的角度來看, Shell本身是一種用C語言編寫的程序,從用戶的角度來看,Shell是用戶與Linux操作系統溝通的橋梁。用戶既可以輸入命令執行,又可以利用 Shell腳本編程,完成更加復雜的操作。在Linux GUI日益完善的今天,在系統管理等領域,Shell編程仍然起著不可忽視的作用。深入地了解和熟練地掌握Shell編程,是每一個Linux用戶的必修功課之一。

Linux的Shell種類眾多,常見的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell語言的語法有所不同,所以不能交換使用。每種Shell都有其特色之處,基本上,掌握其中任何一種就足夠了。在本文中,我們關注的重點是Bash,也就是Bourne Again Shell,由于易用和免費,Bash在日常工作中被廣泛使用;同時,Bash也是大多數Linux系統默認的Shell。在一般情況下,人們并不區分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我們可以看到#!/bin/sh,它同樣也可以改為#!/bin/bash。

利用vi等文本編輯器編寫Shell腳本的格式是固定的,如下:

[cpp]?view plaincopy
  • #!/bin/sh???
  • ??
  • #comments???
  • ??
  • Your?commands?go?here???
  • ?首行中的符號#!告訴系統其后路徑所指定的程序即是解釋此腳本文件的Shell程序。如果首行沒有這句話,在執行腳本文件的時候,將會出現錯誤。后續的部分就是主程序,Shell腳本像高級語言一樣,也有變量賦值,也有控制語句。除第一行外,以#開頭的行就是注釋行,直到此行的結束。如果一行未完成,可以在行尾加上",這個符號表明下一行與此行會合并為同一行。

    編輯完畢,將腳本存盤為filename.sh,文件名后綴sh表明這是一個Bash腳本文件。執行腳本的時候,要先將腳本文件的屬性改為可執行的:

    chmod +x filename.sh

    執行腳本的方法是:

    ./filename.sh

    下面我們從經典的“hello world”入手,看一看最簡單的Shell腳本的模樣。

    [cpp]?view plaincopy
  • #!/bin/sh???
  • #print?hello?world?in?the?console?window???
  • a?=?"hello?world"???
  • echo?$a???
  • Shell Script是一種弱類型語言,使用變量的時候無需首先聲明其類型。新的變量會在本地數據區分配內存進行存儲,這個變量歸當前的Shell所有,任何子進程都不能訪問本地變量。這些變量與環境變量不同,環境變量被存儲在另一內存區,叫做用戶環境區,這塊內存中的變量可以被子進程訪問。變量賦值的方式是:

    variable_name = variable_value

    如果對一個已經有值的變量賦值,新值將取代舊值。取值的時候要在變量名前加$,$variable_name可以在引號中使用,這一點和其他高級語言是明顯不同的。如果出現混淆的情況,可以使用花括號來區分,例如:

    echo "Hi, $as"

    就不會輸出“Hi, hello worlds”,而是輸出“Hi,”。這是因為Shell把$as當成一個變量,而$as未被賦值,其值為空。正確的方法是:

    echo "Hi, ${a}s"

    單引號中的變量不會進行變量替換操作。?

    關于變量,還需要知道幾個與其相關的Linux命令。

    env用于顯示用戶環境區中的變量及其取值;set用于顯示本地數據區和用戶環境區中的變量及其取值;unset用于刪除指定變量當前的取值,該值將被指定為NULL;export命令用于將本地數據區中的變量轉移到用戶環境區。

    下面我們來看幾個例子,結合這個例子,我們來講述Shell Script的語法。?

    shell程序設計:

    一、使用test 測試編寫 unload? 程序,達到文件卸載的功能。

    主要考察的是判斷語句的使用 test?

    代碼如下:

    [cpp]?view plaincopy
  • #!/bin/bash??
  • #upload?program?to?backup?and?remove?files??
  • #syntax:unload?directory??
  • #check?arguments??
  • if?[?$#?-ne?1?]??
  • then??
  • ????echo?"usage:$0<directory>"??
  • ????exit??
  • fi??
  • #check?for?valid?directory?name??
  • if?[?!?-d?$1?]??
  • then??
  • ????echo?"$1?is?not?a?directory"??
  • ????exit??
  • fi??
  • ??
  • cd?$1??
  • ls?-a|cpio?-o?>/dev/null??
  • if?[?$??-eq?0?]??
  • then???
  • ????rm?-rf?*??
  • else??
  • ????echo?"A?problem?has?occured?in?creating?backup"??
  • ????echo?"The?directory?will?not?be?creased"??
  • ????echo?"Please?check?the?backup?device"??
  • ????exit?3??
  • fi??
  • #end?of?unload??
  • 1、修改文件屬性為其添加可執行權限

    [cpp]?view plaincopy
  • fs@ubuntu:~/qiang/shell$?chmod?777?shell1.sh??
  • 2、查看test

    [cpp]?view plaincopy
  • fs@ubuntu:~/qiang/shell$?ls?tmp??
  • prog2.sh??prog5.sh??prog7.sh??sh2.sh??sh4.sh??sh6.sh??
  • prog3.sh??prog6.sh??sh1.sh????sh3.sh??sh5.sh??sh7.sh??
  • 3、執行腳本文件

    [cpp]?view plaincopy
  • fs@ubuntu:~/qiang/shell$?./shell1.sh?tmp??
  • 9?blocks??
  • 4、結果:

    [cpp]?view plaincopy
  • fs@ubuntu:~/qiang/shell$?ls?tmp??
  • fs@ubuntu:~/qiang/shell$???
  • 結果目錄里沒有文件

    附:這里簡單講解一下cpio命令的使用

    cpio [選項] > 文件名或者設備名?
    cpio [選項] < 文件名或者設備名

    [功能]?
    cpio命令是通過重定向的方式將文件進行打包備份,還原恢復的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件。

    [描述]?
    選項說明:詳細選項說明參看下表?
    選項 含義?
    -o 將文件拷貝打包成文件或者將文件輸出到設備上。?
    -i 將打包文件解壓或者將設備上的備份還原到系統。?
    -t 查看cpio打包的文件內容或者輸出到設備上的文件內容。?
    -v 顯示打包過程中的文件名稱。?
    -d 在cpio還原文件的過程中,自動的建立相應的目錄。?
    -c 一種較新的存儲方式。?
    -B 讓默認的Blocks可以增大到5120 bytes,默認Blocks為512 bytes,這樣做的好處是可以加快存取速度。

    注意,?
    1)cpio恢復的路徑,如果cpio在打包備份的時候用的是絕對路徑,那么在恢復的時候會自動恢復到這些絕對路徑下,同理,如果在打包備份用的是相對路徑,還原時也將恢復到相對路徑下。
    2)cpio無法直接讀取文件,它需要每個文件或者目錄的完整路徑名才能識別讀取,而find命令的輸出剛好做到了這點,因此,cpio命令一般和find命令配合使用。?
    3)cpio恢復的時候不會自動覆蓋同名文件。?
    4)不會創建目錄而是直接解壓到當前文件夾。


    二、編寫腳本你查看當前目錄下的文件屬性(是普通文件還是目錄)

    考察的是for語句和判斷語句if...else...

    代碼如下:

    [cpp]?view plaincopy
  • #!/bin/bash??
  • ??
  • for?i?in?*??
  • do??
  • ????if?[?-f?$i?]??
  • ????then??
  • ????????echo?"$i?is?a?file"??
  • ????else??
  • ????????if?[?-d?$i?]??
  • ????????then??
  • ????????????echo?"$i?is?a?directory"??
  • ????????fi??
  • ????fi??
  • done??
  • 1、修改文件屬性為其添加可執行權限

    [cpp]?view plaincopy
  • fs@ubuntu:~/qiang/shell$?chmod?777?shell2.sh??
  • 2、執行腳本文件

    [cpp]?view plaincopy
  • fs@ubuntu:~/qiang/shell$?./shell2.sh??
  • 3、結果:

    [cpp]?view plaincopy
  • fs@ubuntu:~/qiang/shell$?./shell2.sh??
  • prog2.sh?is?a?file??
  • prog3.sh?is?a?file??
  • prog5.sh?is?a?file??
  • prog6.sh?is?a?file??
  • prog7.sh?is?a?file??
  • sh1.sh?is?a?file??
  • sh2.sh?is?a?file??
  • sh3.sh?is?a?file??
  • sh4.sh?is?a?file??
  • sh5.sh?is?a?file??
  • sh6.sh?is?a?file??
  • sh7.sh?is?a?file??
  • shell1.sh?is?a?file??
  • shell2.sh?is?a?file??
  • tmp?is?a?directory??
  • fs@ubuntu:~/qiang/shell$???
  • ?

    三、Shell 函數使用實例

    [cpp]?view plaincopy
  • #!/bin/bash??
  • ??
  • check_user()??
  • {??
  • ????usr=`who?|?grep?$1?|?wc?-l`??
  • ????if?[?$usr?-eq?0?]??
  • ????then??
  • ????????return?0??
  • ????else??
  • ????????return?1??
  • ????fi??
  • }??
  • ??
  • while?true??
  • do??
  • ????echo?"Input?username:"??
  • ????read?username??
  • ????check_user?$username??
  • ????if?[?$??-eq?1?]??
  • ????then???
  • ????????echo?"usr?$username?online"??
  • ????else??
  • ????????echo?"usr?$username?offline"??
  • ????fi??
  • done??
  • 輸出結果:



    附:

    shell、控制臺、終端的區別

    終端(terminal,或者叫物理終端):?

    是一種設備,不是一個程序,一般說的就是能提供命令行用戶界面的設備,典型的是屏幕和鍵盤,或其他的一些物理終端。

    虛擬終端:?

    屏幕和鍵盤只是一個終端,可能不夠用,又不想增加設備投入,就產生了虛擬終端。
    gnome-terminal,urxvt,mlterm,xterm等等是一個程序,職責是模擬終端設備,和虛擬終端的區別表面上在于它以 GUI 形式的窗口出現,內部則是程序結構和系統控制結構有所不同,但本質上差不多。

    控制臺(console):?
    顯示系統消息的終端就叫控制臺,Linux 默認所有虛擬終端都是控制臺,都能顯示系統消息。

    shell:

    shell是一個抽象概念,shell的一切操作都在計算機內部,負責處理人機交互,執行腳本等,是操作系統能正常運行的重要組成部分,bash,ash,zsh,tcsh等是shell這個抽象概念的一種具體的實現,都是一個程序,都能生成一個進程對象。

    總結

    以上是生活随笔為你收集整理的Linux 下shell编程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。