1. 程式人生 > >高階Bash指令碼程式設計指南(2):帶著一個Sha-Bang出發

高階Bash指令碼程式設計指南(2):帶著一個Sha-Bang出發

特別說明,Sha-Bang 指的是 ( #! ) 。

在一個最簡單的例子中,一個shell指令碼其實就是將一堆系統命令列在一個檔案中。它的最基本的用處就是,在你每次輸入特定順序的命令時,可以少敲一些字。

以清除/var/log下的某些log檔案的指令碼為例:

cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp

echo "Logs clean up"

但是該指令碼有很多問題,而且也不規範,執行該指令碼得到如下結果:

這裡寫圖片描述

對該指令碼進行改良,得到如下指令碼:

#!/bin/bash

LOG_DIR=/var/log

cd
$LOG_DIR cat /dev/null > messages cat /dev/null > wtmp echo "Logs clean up." exit

相比於第一個指令碼,該指令碼主要做了三個改進:

  • 指令碼的第一行為#!/bin/bash,這是一個Bash指令碼的正確的開頭部分;
  • 使用變數來指定日誌目錄,使用變數比把程式碼寫死要好的多。
  • 指令碼的最後一行使用exit命令,這個命令是一種正確並且合適的退出指令碼的方法。

接下來看一個真正意義的指令碼:

#!/bin/bash

# Copyright (C) [email protected]

LOG_DIR=/var/log
ROOT_UID=0
LINES=50 E_XCD=66 E_NOTROOT=67 if [ "$UID" -ne "$ROOT_UID" ] then echo "Must be root to run this script." exit $E_NOTROOT fi if [ -n "$1" ] then lines=$1 else lines=$LINES fi cd $LOG_DIR if [ `pwd` != "$LOG_DIR" ] then echo "Can't change to $LOG_DIR." exit $E_XCD fi # more efficent way
# cd $LOG_DIR || { # echo "Cannot change to necessary directory." > &2 # exit $E_XCD # } tail -$lines messages > mesg.tmp mv mesg.tmp messages : > wtmp echo "Logs cleaned up." exit 0

在每個指令碼的開頭都是用”#!”,這意味著告訴你的系統這個檔案的執行需要指定一個直譯器。”#!”是一個兩個位元組的魔數字,是一個指定檔案型別的特殊標記,換句話說,指的就是一個可執行指令碼。在#!之後接著是一個路徑名,這個路徑名指定了一個解釋指令碼中命令的程式。這個程式可以是shell,或者任意一個通用程式。這個指定的程式從頭開始解釋並且執行指令碼中的命令(從#!下邊的一行開始)。

#!也可以被忽略,此時這樣的指令碼檔案就只是命令的集合,無法使用shell內建的指令了。

可以玩一些小技巧:

#!/bin/more

show line 1
show line 2
show line 3
show line 4
show line 5
show line 6
show line 7
show line 8
show line 9
show line 10

上面這個指令碼指定more命令作為直譯器,執行時會把自己進行顯示:

這裡寫圖片描述

#!行最重要的任務就是命令直譯器。因為這行是#開始的,當命令直譯器執行這行程式碼時,會把它作為一個註釋行。當然,在這之前,這行語句已經完成了它的任務,就是呼叫命令直譯器。

呼叫一個指令碼:

編寫完指令碼之後,可以使用sh scriptname或者bash scriptname來呼叫它。更方便的方法是讓指令碼本身就具有可執行許可權,然後使用./scriptname的方式來執行它。

在指令碼被測試和debug後,你可以把它移動到/usr/local/bin,來讓你的指令碼對所有使用者都有用,這樣使用者就可以直接輸入指令碼名字來運行了。

相關推薦

高階Bash指令碼程式設計指南2一個Sha-Bang出發

特別說明,Sha-Bang 指的是 ( #! ) 。 在一個最簡單的例子中,一個shell指令碼其實就是將一堆系統命令列在一個檔案中。它的最基本的用處就是,在你每次輸入特定順序的命令時,可以少敲一些字。 以清除/var/log下的某些log檔案的指令碼為例:

高階Bash指令碼程式設計指南——一本深入學習shell指令碼藝術的書籍

例子清單 4-5. 位置引數 4-6. wh, whois節點名字查詢 5-2. 轉義符 7-1. 什麼是真? 7-7. zmore 8-1. 最大公約數 9-2. 定時輸入 9-9. 下劃線變數 9-17. 變數長度 9-23. 間接引用 9-30. 使用awk來產生偽隨機數 10-19. 巢狀迴

高階Bash指令碼程式設計指南.pdf

【下載地址】一本深入學習shell指令碼藝術的書籍這本書假定你沒有任何關於指令碼或一般程式的程式設計知識, 但是如果你具備相關的知識, 那麼你將很容易就能夠達到中高階的水平. . . 所有這些只是UNIX®浩瀚知識的一小部分. 你可以把本書作為教材, 自學手冊, 或者是關於s

Asp.Net MVC4入門指南2新增一個控制器

MVC代表: 模型-檢視-控制器 。MVC是一個架構良好並且易於測試和易於維護的開發模式。基於MVC模式的應用程式包含: · Models: 表示該應用程式的資料並使用驗證邏輯來強制實施業務規則的資料類。 · Views: 應用程式動態生成 HTML所使用的模板檔案。 · Controllers: 處理

騰訊力作!超實用的iOS 9人機介面指南2設計策略

2.1 設計原則(Design Principles) 2.1.1 美學完整性(Aesthetic Integrity) 美學完整性不評判應用的視覺設計,也不是用來描述應用的風格特徵。美學完整性是指在一款應用的視覺表現和互動行為與功能結合後所傳達出的整體一致性。

Python函數語言程式設計指南生成器

生成器是迭代器,同時也並不僅僅是迭代器,不過迭代器之外的用途實在是不多,所以我們可以大聲地說:生成器提供了非常方便的自定義迭代器的途徑。 這是函數語言程式設計指南的最後一篇,似乎拖了一個星期才寫好,嗯…… 轉載請註明原作者和原文地址:) 4.

菜鳥WDF驅動開發系列2除錯第一個KMDF驅動程式

根據系列上一篇的內容,已經基本作好了驅動除錯環境的配置,現在著手開始試一下怎麼用WinDBG除錯。每一位新手在開始學習驅動開發的時候相信總會看大量的資料,如我第一篇提到的幾本書的確是不錯的,但名著總有一個問題就是,開篇一開始總是會鋪陳太多的基本理論,這會讓我們覺得手足無措,

python高階——網路程式設計Socket2檔案下載案例

1、伺服器 import socket def send_file_2_client(new_client_socket, client_addr): # 1 接收客戶端,需要下載的檔名 # 接收客戶端傳送來的請求 file_name = new_client_soc

Qt與FFmpeg聯合開發指南——編碼2完善功能和基礎封裝

v_op buffer 目前 front from 幀率 inter 博客 int 上一章我用一個demo函數演示了基於Qt的音視頻采集到編碼的完整流程,最後經過測試我們也發現了代碼中存在的問題。本章我們就先處理幾個遺留問題,再對代碼進行完善,最後把編碼功能做基礎封裝。 一

Linux-Shell指令碼程式設計基礎1

1. 我們一般在使用Linux系統的時候,都活接觸到shell指令碼的使用,例如我們經常在linux系統中使用的ls命令、cd命令等,都是衣蛾簡單而又基本的shell命令,在 linux系統中我們一般的使用如下的格式來進行shell指令碼的編寫: (1)格式 #!bin/bash e

Testbench編寫指南2檔案的讀寫操作

Testbench編寫指南(2)檔案的讀寫操作 2018年05月27日 17:36:13 FPGADesigner 閱讀數:996 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/FPGADesigner/article/

Java併發程式設計2執行緒中斷含程式碼

使用interrupt()中斷執行緒當一個執行緒執行時,另一個執行緒可以呼叫對應的Thread物件的interrupt()方法來中斷它,該方法只是在目標執行緒中設定一個標誌,表示它已經被中斷,並立即返回。這裡需要注意的是,如果只是單純的呼叫interrupt()方法,執行緒並沒有實際被中斷,會繼續往下執行。

Python菜鳥快樂遊戲程式設計_pygame2

Python菜鳥快樂遊戲程式設計_pygame(博主錄製,2K解析度,超高清) https://study.163.com/course/courseMain.htm?courseId=1006188025&share=2&shareId=400000000398149  

Linux命令列與shell指令碼程式設計大全

十一、處理使用者輸入 命令列引數 讀取引數: $0是程式名,$1是第一個引數,$2是第二個引數,以此類推,直到第9個引數$9。當引數個數超過10以後,需要在變數數字周圍加上花括號,如${10},如果輸入到命令列的引數是字串且含有空格,需要使用引號。 #! /bin/bash echo

Linux命令列與shell指令碼程式設計大全

一、基本 bash shell命令 建立檔案 : touch 連結檔案:符號連結:是一個實實在在的檔案,兩個通過符號連結在一起的檔案,彼此的內容並不相同。使用ln -s命令。 硬連結:會建立獨立的虛擬檔案,其中包含了原始檔案的資訊及位置。但他們從根本上而言是同一個檔案。原始檔案必須事

Linux命令列與shell指令碼程式設計大全

十二、呈現資料 輸入和輸出     標準檔案描述符                  0 STDIN 標準輸入   &n

標號2python(就業階段)——Linux系統命令1——《高階Linux命令及命令選項的使用》

一、高階Linux命令及命令選項的使用 <1>重定向命令:> Linux允許將命令執行結果重定向到一個檔案,本應顯示在終端上的內容儲存到指定檔案中。 1、ls >> test.txt 輸出重定向則會追加到檔案的尾部。 2、ls > test.t

Java程式設計思想2

第6章 訪問許可權控制 1 訪問許可權控制的等級,從最大許可權到最小許可權依次為:public,protected,包訪問許可權(沒有關鍵字)和private 2 如果想要使用類,可以在import語句中匯入該類或使用該類的全名來指定 // 使用ArrayList的一種方法是使用其全名j

Tuxedo與Weblogic互連指南2--Weblogic部分

Weblogic部分 目標        通過配置Weblogic中的WTC服務實現呼叫Tuxedo的TOUPPER,以及使用客戶端呼叫Tuxedo中配置的TOLOWER服務轉發到Weblogic。 步驟  &nb

Linux真小白入門教程第五集——Bash Shell命令學習2

shell還提供了很多在Linux檔案系統上操作檔案的命令 touch命令可以輕鬆建立空檔案。 touch test_one 建立新檔案,並將你的使用者名稱作為檔案的屬主,此時檔案的大小為0,因為touch命令只建立了一個空檔案。   cp命令可以完成檔案的複製操作