日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Linux平臺(tái)下Python腳本編程入門(二)

在“Linux 平臺(tái)下 Python 腳本編程入門” 系列之前的文章里,我們向你介紹了 Python 的簡(jiǎn)介,它的命令行 shell 和 IDLE(LCTT 譯注:python 自帶的一個(gè) IDE)。我們也演示了如何進(jìn)行算術(shù)運(yùn)算、如何在變量中存儲(chǔ)值、還有如何打印那些值到屏幕上。***,我們通過(guò)一個(gè)練習(xí)示例講解了面向?qū)ο缶幊讨蟹椒ê蛯傩愿拍睢?/p>

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)扶溝免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

本篇中,我們會(huì)討論控制流(根據(jù)用戶輸入的信息、計(jì)算的結(jié)果,或者一個(gè)變量的當(dāng)前值選擇不同的動(dòng)作行為)和循環(huán)(自動(dòng)重復(fù)執(zhí)行任務(wù)),接著應(yīng)用我們目前所學(xué)東西來(lái)編寫(xiě)一個(gè)簡(jiǎn)單的 shell 腳本,這個(gè)腳本會(huì)顯示操作系統(tǒng)類型、主機(jī)名、內(nèi)核版本、版本號(hào)和機(jī)器硬件架構(gòu)。

這個(gè)例子盡管很基礎(chǔ),但是會(huì)幫助我們證明,比起使用一般的 bash 工具,我們通過(guò)發(fā)揮 Python 面向?qū)ο蟮奶匦詠?lái)編寫(xiě) shell 腳本會(huì)更簡(jiǎn)單些。

換句話說(shuō),我們想從這里出發(fā):

 
 
  1. # uname -snrvm

檢查 Linux 的主機(jī)名

用 Python 腳本來(lái)檢查 Linux 的主機(jī)名

或者

用腳本檢查 Linux 系統(tǒng)信息

看著不錯(cuò),不是嗎?那我們就挽起袖子,開(kāi)干吧。

Python 中的控制流

如我們剛說(shuō)那樣,控制流允許我們根據(jù)一個(gè)給定的條件,選擇不同的輸出結(jié)果。在 Python 中最簡(jiǎn)單的實(shí)現(xiàn)就是一個(gè) if/else 語(yǔ)句。

基本語(yǔ)法是這樣的:

 
 
  1. if 條件:
  2.     # 動(dòng)作 1
  3. else:
  4.     # 動(dòng)作 2

當(dāng)“條件”求值為真(true),下面的代碼塊就會(huì)被執(zhí)行(# 動(dòng)作 1代表的部分)。否則,else 下面的代碼就會(huì)運(yùn)行。 “條件”可以是任何表達(dá)式,只要可以求得值為真或者假。

舉個(gè)例子:

  1. 1 < 3 # 真
  2. firstName == "Gabriel" # 對(duì) firstName 為 Gabriel 的人是真,對(duì)其他不叫 Gabriel 的人為假
  • 在***個(gè)例子中,我們比較了兩個(gè)值,判斷 1 是否小于 3。
  • 在第二個(gè)例子中,我們比較了 firstName(一個(gè)變量)與字符串 “Gabriel”,看在當(dāng)前執(zhí)行的位置,firstName 的值是否等于該字符串。
  • 條件和 else 表達(dá)式都必須跟著一個(gè)冒號(hào)(:)。
  • 縮進(jìn)在 Python 中非常重要。同樣縮進(jìn)下的行被認(rèn)為是相同的代碼塊。

請(qǐng)注意,if/else 表達(dá)式只是 Python 中許多控制流工具的一個(gè)而已。我們先在這里了解以下,后面會(huì)用在我們的腳本中。你可以在官方文檔中學(xué)到更多工具。

Python 中的循環(huán)

簡(jiǎn)單來(lái)說(shuō),一個(gè)循環(huán)就是一組指令或者表達(dá)式序列,可以按順序一直執(zhí)行,只要條件為真,或者對(duì)列表里每個(gè)項(xiàng)目執(zhí)行一一次。

Python 中最簡(jiǎn)單的循環(huán),就是用 for 循環(huán)迭代一個(gè)給定列表的元素,或者對(duì)一個(gè)字符串從***個(gè)字符開(kāi)始到執(zhí)行到***一個(gè)字符結(jié)束。

基本語(yǔ)句:

 
 
  1. for x in example:
  2.     # do this

這里的 example 可以是一個(gè)列表或者一個(gè)字符串。如果是列表,變量 x 就代表列表中每個(gè)元素;如果是字符串,x 就代表字符串中每個(gè)字符。

 
 
  1. >>> rockBands = []
  2. >>> rockBands.append("Roxette")
  3. >>> rockBands.append("Guns N' Roses")
  4. >>> rockBands.append("U2")
  5. >>> for x in rockBands:
  6.         print(x)
  7. >>> firstName = "Gabriel"
  8. >>> for x in firstName:
  9.         print(x)

上面例子的輸出如下圖所示:

學(xué)習(xí) Python 中的循環(huán)

Python 模塊

很明顯,必須有個(gè)辦法將一系列的 Python 指令和表達(dá)式保存到文件里,然后在需要的時(shí)候取出來(lái)。

準(zhǔn)確來(lái)說(shuō)模塊就是這樣的。比如,os 模塊提供了一個(gè)到操作系統(tǒng)的底層的接口,可以允許我們做許多通常在命令行下執(zhí)行的操作。

沒(méi)錯(cuò),os 模塊包含了許多可以用來(lái)調(diào)用的方法和屬性,就如我們之前文章里講解的那樣。不過(guò),我們需要使用 import 關(guān)鍵詞導(dǎo)入(或者叫包含)模塊到運(yùn)行環(huán)境里來(lái):

 
 
  1. >>> import os

我們來(lái)打印出當(dāng)前的工作目錄:

 
 
  1. >>> os.getcwd()

學(xué)習(xí) Python 模塊

現(xiàn)在,讓我們把這些結(jié)合在一起(包括之前文章里討論的概念),編寫(xiě)需要的腳本。

Python 腳本

以一段聲明文字開(kāi)始一個(gè)腳本是個(gè)不錯(cuò)的想法,它可以表明腳本的目的、發(fā)布所依據(jù)的許可證,以及一個(gè)列出做出的修改的修訂歷史。盡管這主要是個(gè)人喜好,但這會(huì)讓我們的工作看起來(lái)比較專業(yè)。

這里有個(gè)腳本,可以輸出這篇文章最前面展示的那樣。腳本做了大量的注釋,可以讓大家可以理解發(fā)生了什么。

在進(jìn)行下一步之前,花點(diǎn)時(shí)間來(lái)理解它。注意,我們是如何使用一個(gè) if/else 結(jié)構(gòu),判斷每個(gè)字段標(biāo)題的長(zhǎng)度是否比字段本身的值還大。

基于比較結(jié)果,我們用空字符去填充一個(gè)字段標(biāo)題和下一個(gè)之間的空格。同時(shí),我們使用一定數(shù)量的短線作為字段標(biāo)題與其值之間的分割符。

 
 
  1. #!/usr/bin/python3
  2. # 如果你沒(méi)有安裝 Python 3 ,那么修改這一行為 #!/usr/bin/python
  3. # Script name: uname.py
  4. # Purpose: Illustrate Python OOP capabilities to write shell scripts more easily
  5. # License: GPL v3 (http://www.gnu.org/licenses/gpl.html)
  6. # Copyright (C) 2016 Gabriel Alejandro Cánepa
  7. # Facebook / Skype / G+ / Twitter / Github: gacanepa
  8. # Email: gacanepa (at) gmail (dot) com
  9. # This program is free software: you can redistribute it and/or modify
  10. # it under the terms of the GNU General Public License as published by
  11. # the Free Software Foundation, either version 3 of the License, or
  12. # (at your option) any later version.
  13. # This program is distributed in the hope that it will be useful,
  14. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. # GNU General Public License for more details.
  17. # You should have received a copy of the GNU General Public License
  18. # along with this program.  If not, see .
  19. # REVISION HISTORY
  20. # DATE        VERSION AUTHOR         CHANGE DESCRIPTION
  21. # ---------- ------- --------------
  22. # 2016-05-28 1.0     Gabriel Cánepa    Initial version
  23. ### 導(dǎo)入 os 模塊
  24. import os
  25. ### 將 os.uname() 的輸出賦值給 systemInfo 變量
  26. ### os.uname() 會(huì)返回五個(gè)字符串元組(sysname, nodename, release, version, machine)
  27. ### 參見(jiàn)文檔:https://docs.python.org/3.2/library/os.html#module-os
  28. systemInfo = os.uname()
  29. ### 這是一個(gè)固定的數(shù)組,用于描述腳本輸出的字段標(biāo)題
  30. headers = ["Operating system","Hostname","Release","Version","Machine"]
  31. ### 初始化索引值,用于定義每一步迭代中
  32. ### systemInfo 和字段標(biāo)題的索引
  33. index = 0
  34. ### 字段標(biāo)題變量的初始值
  35. caption = ""
  36. ### 值變量的初始值
  37. values = ""
  38. ### 分隔線變量的初始值
  39. separators = ""
  40. ### 開(kāi)始循環(huán)
  41. for item in systemInfo:
  42.     if len(item) < len(headers[index]):
  43.      ### 一個(gè)包含橫線的字符串,橫線長(zhǎng)度等于item[index] 或 headers[index]
  44.      ### 要重復(fù)一個(gè)字符,用引號(hào)圈起來(lái)并用星號(hào)(*)乘以所需的重復(fù)次數(shù) 
  45.      separators = separators + "-" * len(headers[index]) + " "
  46.      caption = caption + headers[index] + " "
  47.      values = values + systemInfo[index] + " " * (len(headers[index]) - len(item)) + " "
  48.     else:
  49.      separators = separators + "-" * len(item) + " "
  50.      caption =  caption + headers[index] + " " * (len(item) - len(headers[index]) + 1)
  51.      values = values + item + " "
  52.     ### 索引加 1
  53.     index = index + 1
  54. ### 終止循環(huán)
  55. ### 輸出轉(zhuǎn)換為大寫(xiě)的變量(字段標(biāo)題)名
  56. print(caption.upper())
  57. ### 輸出分隔線
  58. print(separators)
  59. # 輸出值(systemInfo 中的項(xiàng)目)
  60. print(values)
  61. ### 步驟:
  62. ### 1) 保持該腳本為 uname.py (或任何你想要的名字)
  63. ### 并通過(guò)如下命令給其執(zhí)行權(quán)限:
  64. ### chmod +x uname.py
  65. ### 2) 執(zhí)行它;
  66. ### ./uname.py

如果你已經(jīng)按照上述描述將上面的腳本保存到一個(gè)文件里,并給文件增加了執(zhí)行權(quán)限,那么運(yùn)行它:

 
 
  1. # chmod +x uname.py
  2. # ./uname.py

如果試圖運(yùn)行腳本時(shí)你得到了如下的錯(cuò)誤:

 
 
  1. -bash: ./uname.py: /usr/bin/python3: bad interpreter: No such file or directory

這意味著你沒(méi)有安裝 Python3。如果那樣的話,你要么安裝 Python3 的包,要么替換解釋器那行(如果如之前文章里概述的那樣,跟著下面的步驟去更新 Python 執(zhí)行文件的軟連接,要特別注意并且非常小心):

 
 
  1. #!/usr/bin/python3

 
 
  1. #!/usr/bin/python

這樣會(huì)通過(guò)使用已經(jīng)安裝好的 Python 2 去執(zhí)行該腳本。

注意:該腳本在 Python 2.x 與 Pyton 3.x 上都測(cè)試成功過(guò)了。

盡管比較粗糙,你可以認(rèn)為該腳本就是一個(gè) Python 模塊。這意味著你可以在 IDLE 中打開(kāi)它(File → Open… → Select file):

在 IDLE 中打開(kāi) Python

一個(gè)包含有文件內(nèi)容的新窗口就會(huì)打開(kāi)。然后執(zhí)行 Run → Run module(或者按 F5)。腳本的輸出就會(huì)在原始的 Shell 里顯示出來(lái):

執(zhí)行 Python 腳本

如果你想純粹用 bash 寫(xiě)一個(gè)腳本,也獲得同樣的結(jié)果,你可能需要結(jié)合使用 awk、sed,并且借助復(fù)雜的方法來(lái)存儲(chǔ)與獲得列表中的元素(不要忘了使用 tr 命令將小寫(xiě)字母轉(zhuǎn)為大寫(xiě))。

另外,在所有的 Linux 系統(tǒng)版本中都至少集成了一個(gè) Python 版本(2.x 或者 3.x,或者兩者都有)。你還需要依賴 shell 去完成同樣的目標(biāo)嗎?那樣你可能需要為不同的 shell 編寫(xiě)不同的版本。

這里演示了面向?qū)ο缶幊痰奶匦?,它?huì)成為一個(gè)系統(tǒng)管理員得力的助手。

注意:你可以在我的 Github 倉(cāng)庫(kù)里獲得 這個(gè) python 腳本(或者其他的)。

總結(jié)

這篇文章里,我們講解了 Python 中控制流、循環(huán)/迭代、和模塊的概念。我們也演示了如何利用 Python 中面向?qū)ο缶幊痰姆椒ê蛯傩詠?lái)簡(jiǎn)化復(fù)雜的 shell 腳本。

你有任何其他希望去驗(yàn)證的想法嗎?開(kāi)始吧,寫(xiě)出自己的 Python 腳本,如果有任何問(wèn)題可以咨詢我們。不必猶豫,在分割線下面留下評(píng)論,我們會(huì)盡快回復(fù)你。


本文標(biāo)題:Linux平臺(tái)下Python腳本編程入門(二)
文章源于:http://www.dlmjj.cn/article/djpighh.html