導航:首頁 > 編程語言 > bash編程系列

bash編程系列

發布時間:2023-01-04 07:09:05

『壹』 bash是什麼編程語言呀

什麼是shell

shell是用戶和linux操作系統之間的介面。Linux中有多種shell,其中預設使用的是Bash。本章講述了shell的工作原理,shell的種類,shell的一般操作及Bash的特性。

什麼是shell

Linux系統的shell作為操作系統的外殼,為用戶提供使用操作系統的介面。它是命令語言、命令解釋程序及程序設計語言的統稱。

shell是用戶和Linux內核之間的介面程序,如果把Linux內核想像成一個球體的中心,shell就是圍繞內核的外層。當從shell或其他程序向Linux傳遞命令時,內核會做出相應的反應。

shell是一個命令語言解釋器,它擁有自己內建的shell命令集,shell也能被系統中其他應用程序所調用。用戶在提示符下輸入的命令都由shell先解釋然後傳給Linux核心。

Shell是一種具備特殊功能的程序, 它是介於使用者和 UNIX/linux 操作系統之核心
程序(kernel)間的一個介面。為什麼我們說 shell 是一種介於系統核心程序與使用者
間的中介者呢?讀過操作系統概論的讀者們都知道操作系統是一個系統資源的管理者與分
配者,當您有需求時,您得向系統提出;從操作系統的角度來看,它也必須防止使用者因
為錯誤的操作而造成系統的傷害?眾所周知,對計算機下命令得透過命令(command) 或
是程序(program);程序有編譯器(compiler)將程序轉為二進制代碼,可是命令呢?
其實shell 也是一支程序,它由輸入設備讀取命令,再將其轉為計算機可以了解的機械碼,
然後執行它。
各種操作系統都有它自己的 shell,以 DOS 為例,它的 shell 就是 command.com文
件。如同 DOS 下有 NDOS,4DOS,DRDOS 等不同的命令解譯程序可以取代標準的
command.com ,UNIX 下除了 Bourne shell(/bin/sh) 外還有 C shell(/bin/csh)、
Korn shell(/bin/ksh)、Bourne again shell(/bin/bash)、Tenex C shell(tcsh)
等其它的 shell。UNIX/linux將 shell 獨立於核心程序之外, 使得它就如同一般的應用
程序, 可以在不影響操作系統本身的情況下進行修改、更新版本或是添加新的功能。

有一些命令,比如改變工作目錄命令cd,是包含在shell內部的。還有一些命令,例如拷貝命令cp和移動命令rm,是存在於文件系統中某個目錄下的單獨的程序。對用戶而言,不必關心一個命令是建立在shell內部還是一個單獨的程序。

shell首先檢查命令是否是內部命令,若不是再檢查是否是一個應用程序(這里的應用程序可以是Linux本身的實用程序,如ls和rm,也可以是購買的商業程序,如xv,或者是自由軟體,如emacs)。然後shell在搜索路徑里尋找這些應用程序(搜索路徑就是一個能找到可執行程序的目錄列表)。如果鍵入的命令不是一個內部命令並且在路徑里沒有找到這個可執行文件,將會顯示一條錯誤信息。如果能夠成功找到命令,該內部命令或應用程序將被分解為系統調用並傳給Linux內核。

shell的另一個重要特性是它自身就是一個解釋型的程序設計語言,shell程序設計語言支持絕大多數在高級語言中能見到的程序元素,如函數、變數、數組和程序控制結構。shell編程語言簡單易學,任何在提示符中能鍵入的命令都能放到一個可執行的shell程序中。

當普通用戶成功登錄,系統將執行一個稱為shell的程序。正是shell進程提供了命令行提示符。作為默認值(TurboLinux系統默認的shell是BASH),對普通用戶用「$」作提示符,對超級用戶(root)用「#」作提示符。

一旦出現了shell提示符,就可以鍵入命令名稱及命令所需要的參數。shell將執行這些命令。如果一條命令花費了很長的時間來運行,或者在屏幕上產生了大量的輸出,可以從鍵盤上按ctrl+c發出中斷信號來中斷它(在正常結束之前,中止它的執行)。

當用戶准備結束登錄對話進程時,可以鍵入logout命令、exit命令或文件結束符(EOF)(按ctrl+d實現),結束登錄。

『貳』 linux bash 編程

#!/bin/bash
dirname='/home/flycat'
#wav文件所在的目錄

cpdir='/home/wav'
#要cp文件的上級目錄,比如我要在這個目錄下按照前4位數建立文件名

cd $dirname
#進入wav文件所在目錄

filename=(`ls | sed -rn 's/([0-9]*)_(.*)$/\1/p' | sort -u`)
#截取wav文件_前的數字,我是按照_前面數字不一定是4位,有可能是多個寫的。所以就算
#以後你前面的數字超過4位,也可以匹配到,提取_前面的數字並去重,並復制給filename這個數組

for i in {filename[*]};do
#依次代入數組的元素

mkdir ${cpdir}/${i}
#按照元素創建文件名

ls ${i}* | xargs -i cp {} ${cpdir}/${i}
#按照元素名進行cp

done
#腳本沒測試,自己按照自己的需求在改改吧。
#大概就是這個意思,你自己在修改一下吧。

『叄』 Bash編程1——基本定義

POSIX:一系列基於Unix的開放系統標准。 Bash主要關注posix 1003.1標準的Shell和Utilities部分。

blank :空格或tab字元

builtin:由shell本身在內部實現的命令,而不是由文件系統中的某個可執行程序實現的命令。

control operator: 執行控制功能的記號。 它是換行符或以下之一:『||』, 『&&』, 『&』, 『;』, 『;;』, 『;&』, 『;;&』, 『|』, 『|&』, 『(』, or 『)』

exit status:命令返回給調用者的值。 該值限制為8位,因此最大值為255。

field:一個文本單元,它是一個shell擴展的結果。 擴展後,執行命令時,生成的欄位將用作命令名稱和參數。

filename:用於標識文件的字元串。

job:組成一個管道的進程組以及其任一子進程,這些進程都處於同樣的進程組。

job control:用戶可以選擇性地停止(暫停)和重新啟動(恢復)進程執行的機制。

metachracter:一個分隔單詞的字元(不加引號時)。 元字元是空格,製表符,換行符或以下字元之一:『|』, 『&』, 『;』, 『(』, 『)』, 『<』, or 『>』。

name:由字母,數字和下劃線組成並且以字母或下劃線開頭的單詞。 名稱用作shell變數名和函數名。 也稱為標識符。

operator:控制操作符或重定向操作符。 運算符包含至少一個不帶引號的元字元。

process group:一個具有相同進程組ID的相關進程的集合。

process group ID:在其生命周期內表示進程組的唯一標識符。

reserved word:一個對shell有特殊意義的詞。 大多數保留字引入了shell流控制結構,例如for和while。

return status:exit status的同義詞。

signal:一種機制,通過該機制,內核可以通知系統中發生的事件。

special builtin:shell內置命令,由posix標准分類為特殊命令。

token:shell的一系列字元被認為是一個單元。 它既可以是單詞,也可以是運算符。

word:由shell處理為一個單元的字元序列。 單詞可能不包括不帶引號的元字元。

『肆』 Bash編程013——環境變數

環境變數可以幫助提升你的Shell體驗。很多程序和腳本都通過環境變數來獲取系統信息,存儲臨時數據和配置信息。

bash使用環境變數( environment variables)來存儲有關shell會話和工作環境的信息。這項功能允許你在內存中存儲數據,以便程序或shell腳本能夠輕松訪問。這是存儲持久數據的一種簡便方法。bash的環境變數分為兩類:全局變數和局部變數。

補充:bash使用一致的專有環境變數,但是不同發行版的linux可能會添加自己的環境變數,本博客使用的發行版為Ubuntu 16.04.5 Gnome。

全局變數對於shell會話和所有生成的子shell都是可見的。全局環境變數有助於子shell獲取父shell信息。

在Linux中有四個命令可以幫助我們查看所有的環境變數,printenv、env、set、declare。

使用set命令時會一起顯示之前定義的函數,僅顯示變數可以使用如下命令:

局部變數只能在定義它們的進程中可見,Linux也有默認定義的標准局部環境變數。你也可以自己定義局部環境變數,稱為用戶定義局部變數。

set命令會顯示某個特定進程的所有環境變數,包括局部變數、全局變數以及用戶定義變數。

補充:set、env、printenv之間的區別很細微。set命令會顯示出所有變數,並且按照字母順序排序。env和printenv輸出相同,但是僅含有全局變數,並且未對變數排序。

設置局部用戶定義變數,就是之前002一節提到的變數。

注意:一般bash的環境變數都是使用的大寫字母,建議自己的變數名為小寫,避免產生沖突。

設置全局環境變數

先創建一個局部環境變數,然後使用export命令將其導出到全局變數。

使用unset命令,格式unset varname

注意:在子shell中刪除全局環境變數不會影響到父shell的全局環境變數。

HOME:當前用戶的主目錄

IFS:shell用來將文本字元串分割成欄位的一系列字元

PATH:shell用來查找命令的目錄列表。當你輸入一個命令時,shell會按照這個目錄遍歷尋找。

在登錄系統啟動一個bash shell時,默認情況下bash會在幾個文件中查找命令。這些文件叫做啟動文件或者環境文件。bash檢查的啟動文件取決於啟動bash的方式:

登錄Linux系統是,bash作為登錄shell啟動。登錄shell會一次從以下幾個啟動文件中讀取命令。

/etc/profile文件是系統上默認的bash shell的主啟動文件。系統上的每個用戶登錄時都是執行這個文件。

注意: 某些Linux發行版使用了可拆卸式認證模塊(PAM)。這時,PAM文件會在bash啟動前處理,這些文件可能會包含環境變數。PAM文件包括/etc/environment和$HOME/.pam_environment文件。

我們這里來查看一下/etc/profile文件的內容,學了之前的內容的話,這個文件很容易理解。

$HOME目錄下的啟動文件

剩下的啟動文件都啟著同一個作用:提供一個用戶專屬的啟動文件來定義該用戶所用到的環境變數。一般Linux發行版只有到下面這四個啟動文件中的一兩個。

這里列出Ubuntu的啟動文件:

可以看到這里只有.bashrc和.profile兩個文件。

shell會按照以下順序執行啟動文件,找到第一個其他的就會被忽略。

注意:這里沒有$HOME/.bbashrc,因為該文件是通過上面三個文件中的一個運行的。

我們來查看一下.profile文件,.bashrc文件請自行查看。

注意:這里會檢查當前運行的shell是否是bash,如是的話,檢查是否存在$HOME/.bashrc,若存在則載入該文件。

互動式shell不是登錄系統時啟動的,它可能是你打開終端啟動的。互動式shell不會訪問/etc/profile文件,而是只會檢查用戶HOME目錄中的.bashrc文件。

執行shell腳本是的非互動式shell。腳本能以不同的方式執行,可以啟動子shell執行,也可以在當前shell中執行。

bash提供了一個BASH_ENV的環境變數,當shell啟動一個非互動式shell進程時,它會檢查這個環境邊浪來查看要執行的啟動文件。若有指定的文件,則shell會執行該文件。Ubuntu未設置該變數。

若BASH_ENV未設置,那麼非互動式shell如何獲得環境變數呢?對於以子shell進程執行的情況,子shell會繼承父shell導出的變數(export)。對於在當前shell中執行的情況,變數即為當前shell的變數。

『伍』 在linux下能創建windows 的文件系統嗎

所有課程全部公益學習,重磅出擊,滿滿的干貨!看完就會明白!

前言:加管理老師QQ開通公益學習許可權 1815759616

01 運維基礎
01_01_Centos7.2簡介.avi
01_02_Centos7.2安裝.avi
01_03_操作系統基礎.avi
01_04_Linux操作系統基礎.avi
02_01_Linux操作系統及常用命令.avi
02_02_Linux操作系統及常用命令.avi
02_03_Linux根文件系統詳解.avi
02_04_Linux文件管理命令詳解.avi
03_01_Linux文件管理類命令詳解.avi
03_02_bash特性詳解.avi
03_03_bash特性詳解.avi
03_04_Linux用戶及許可權詳解.avi
04_01_Linux用戶管理命令詳解.avi
04_02_許可權及許可權管理.avi
04_03_管理及IO重定向.avi
04_04_grep及正則表達式.avi
05_01_egrep及擴展正則表達式.avi
05_02_bash腳本編程之一 變數、變數類型等.avi
05_03_bash腳本編程之二 條件判斷-.avi
05_04_bash腳本編程之三 條件判斷及算術運算.avi
06_01_bash腳本編程之四 整數測試及特殊變數.avi
06_02_sed命令.avi
06_03_bash腳本編程之五 字元串測試及for循環.avi
07_01_vim編輯器詳解.avi
07_02_bash腳本編程之六 使用腳本選項及組合條件測試.avi
07_03_Linux文件查找詳解.avi
07_04_特殊許可權SUID等詳解.avi
08_01_facl及用戶及Linux終端.avi
08_02_bash腳本編程之七 case語句及腳本選項進階.avi
08_03_磁碟及文件系統管理詳解之一.avi
08_04_磁碟及文件系統管理詳解之二.avi
09_01_磁碟及文件系統管理詳解之三.avi
09_02_磁碟及文件系統管理詳解之五.avi
09_03_磁碟及文件系統管理詳解之五.avi
09_04_Linux壓縮及歸檔.avi
10_01_Raid及mdadm命令之一.avi
10_02_Raid及mdadm命令之二.avi
10_03_LVM之一.avi
10_04_LVM之二.avi
10_05_腳本編程之八 腳本完成磁碟分區格式化.avi
11_01_Linux網路配置之一.avi
11_02_Linux網路配置之二 IP報文.avi
11_03_Linux網路配置之三 TCP報文.avi
11_04_Linux網路配置之四 ifconfig及ip命令詳解.avi
12_01_Linux軟體管理之一 rpm.avi
12_02_Linux軟體管理之二 rpm.avi
12_03_Linux軟體管理之三 yum.avi
12_04_Linux軟體管理之四 yum.avi
13_01_bash腳本編程之九 while循環.avi
13_02_bash腳本編程之十 函數).avi
13_03_Linux進程管理之一.avi
13_04_Linux進程管理之二.avi
14_01_Linux系統啟動流程詳解之一 運行級別及grub.avi
14_02_Linux系統啟動流程之二 內核及init.avi
14_03_bash腳本編程之十一(Linux啟動流程之三) SysV服務腳本.avi
14_04_Linux內核編譯及系統裁減之一.avi
15_01_bash腳本編程之十二(Linux系統裁減之二) 系統函數庫.avi
15_02_bash腳本編程之十三(Linux系統裁減之三) 系統函數庫.avi
15_03_Linux系統裁減之四 自定義內核及busybox完成系統定製.avi
16_01_bash腳本編程之十四 信號捕捉及系統管理之任務計劃.avi
16_02_Linux系統裁減之五.avi
16_03_Linux日誌系統syslog.avi
16_04_Linux系統裁減之六 為系統添加ssh服務.avi
17_01_RHEL5.8系統安裝及Kickstart.avi
17_02_Linux系統故障排除.avi
17_03_sudo詳解.avi
18_01_加密類型及其相關演算法.avi
18_02_ssl協議、openssl及創建私有CA.avi
18_03_OpenSSH服務及其相關應用.avi
19_01_DNS服務相關概念詳解.avi
19_02_DNS服務相關概念詳解.avi
19_03_Bind97服務安裝配置.avi
20_01_DNS主從復制及區域傳送.avi
20_02_DNS子域授權.avi
20_03_DNS視圖及日誌系統.avi
20_04_DHCP服務.avi
21_01_Web服務及http協議.avi
21_02_httpd安裝配置.avi
21_03_httpd屬性配置.avi
22_01_httpd虛擬主機.avi
22_02_基於openssl的https服務配置.avi

2 運維中級
23_01_php相關概念及配置.avi
23_02_資料庫及MySQL.avi
23_03_MySQL初步,數據類型及SQL語句.avi
23_04_建立LAMP平台.avi
24_01_編譯安裝LAMP之httpd-2.4.4.avi
24_02_編譯安裝LAMP之MySQL-5.5.28(通用二進制格式).avi
24_03_編譯安裝LAMP之php-5.4.13、xcache-2.0及使用ab命令實現 24_04_編譯安裝LAMP之配置httpd以FastCGI方式與php整合.avi
25_01_郵件服務系列之基礎原理.avi
25_02_郵件服務系列之編譯安裝Postfix-2.10.0.avi
25_03_郵件服務系列之Postifx常用配置.avi
25_04_郵件服務系列之Postfix常用配置.avi
26_01_郵件服務系列之 postifx+sasl+dovecot及虛擬域相關概念.avi
26_02_郵件服務系列之虛擬域、虛擬用戶和webmail.avi
26_03_郵件服務系列之pop3s、maildrop.avi
27_01_ftp服務.avi
27_02_ftp服務.avi
27_03_nfs服務.avi
28_01_iptables系列之基礎原理.avi
28_02_iptables系列之基本應用及顯式擴展.avi
28_03_iptables系列之常用擴展模塊.avi
28_04_iptables系列之nat及其過濾功能.avi
29_01_iptables系列之layer7.avi
29_02_iptables系列之layer7.avi
29_03_samba之一.avi
29_04_samba之二.avi
30_01_tcp_wraper&xinetd.avi
30_02_tcp_wrapper&xinetd.avi
30_03_nss&pam.avi
30_04_nss&pam.avi
31_01_bash編程系列之數組.avi
31_02_bash腳本編程之在bash腳本中使用選項.avi
31_03_配置使用vnc服務.avi
32_01_mysql系列之一關系型資料庫基礎理論.avi
32_02_mysql系列之二關系型資料庫基礎理論.avi
32_03_mysql系列之三MySQL資料庫基礎及編譯安裝.avi
32_04_mysql系列之四mysql客戶端工具的使用.avi
33_01_MySQL系列之五——MySQL數據類型及sql模型.avi
33_02_MySQL系列之六——MySQL管理表和索引.avi
33_03_MySQL系列之七——單表查詢、多表查詢和子查詢.avi
33_04_MySQL系列之八——多表查詢、子查詢及視圖.avi
34_01_MySQL系列之九——MySQL事務和隔離級別.avi
34_02_MySQL系列之十——MySQL事務和隔離級別.avi
34_03_MySQL系列之十一——MySQL用戶和許可權管理.avi
34_04_MySQL系列之十二——MySQL日誌管理.avi
35_01_MySQL系列之十三——MySQL日誌管理.avi
35_02_MySQL系列之十四——MySQL備份和恢復.avi
35_03_MySQL系列之十五——使用LVM快照進行資料庫備份.avi
35_04_MySQL系列之十六——使用xtrabackup進行資料庫備份.avi

03 運維高級
36_01_Linux集群系列之一——集群基礎概念.avi
36_02_Linux集群系列之二——LVS類型詳解.avi
36_03_Linux集群系列之三——LVS調度方法及NAT模型的演示.avi
37_01_Linux集群系列之四——LVS DR詳解及配置演示.avi
37_02_Linux集群系列之五——腳本實現LVS後端服務健康狀態檢
37_03_Linux集群系列之六——LVS持久連接.avi
37_04_awk入門及進階.avi
38_01_Linux集群系列之七——高可用集群原理詳解.avi
38_02_Linux集群系列之八——高可用集群原理詳解之共享存儲).avi
38_03_Linux集群系列之九——高可用集群原理詳解之多節點集群.avi
38_04_Linux集群系列之十——高可用集群之heartbeat安裝配置.avi
39_01_Linux集群系列之十一——高可用集群之heartbeat基於crm進行
39_02_Linux集群系列之十二——高可用集群之基於heartbeat和nfs的
39_03_Linux集群系列之十三——高可用集群之corosync基礎概念及
39_04_Linux集群系列之十四——高可用集群之配置corosync資源及
40_01_Linux集群系列之十五——分布式復制塊設備drbd的基礎概念
40_02_Linux集群系列之十六——基於drbd+corosync的高可用 40_03_Linux集群系列之十七——RHCS架構詳解.avi
40_04_Linux集群系列之十八——RHCS集群配置.avi
41_01_Linux集群系列之十九——iSCSI協議、架構及其安裝配置.avi
41_02_Linux集群系列之二十——iSCSI及gfs2.avi
41_03_Linux集群系列之二十一——iSCSI、cLVM和gfs2.avi
41_04_Linux集群系列之二十二——keepalived詳解.avi
41_05_Linux集群系列之二十三——keepalived詳解補充.avi
42_01_MySQL主從復制——概念及架構詳解.avi
42_02_MySQL主從復制——MySQL-5.5非同步、半同步配置及其注意
42_03_MySQL主從復制——MySQL-5.6基於GTID及多線程的復制.avi
42_04_MySQL主從復制——mysql-proxy.0.8.3實現MySQL-5.6讀寫分
43_01_IO復用.avi
43_02_IO復用詳解及高並發系統設計初步.avi
43_03_配置Ngnix作為Web Server詳解.avi
44_01_nginx.avi
44_02_Nginx反向代理、負載均衡、緩存、URL重寫及讀寫分離.avi
44_03_memcached安裝配置及保存php session於memcached中的方
45_01_http反向代理及haproxy.avi
45_02_http反向代理及haproxy.avi
45_03_http緩存機制及varnish詳解.avi
46_01_Tomcat系列之java技術詳解.avi
46_02_Tomcat系列之java技術詳解.avi
46_03_Tomcat系列之組件詳解及服務安裝配置.avi
47_01_Tomcat系列之apache使用mod_jk和mod_proxy反向代理
47_02_Tomcat系列之apache負載均衡請求至tomcat及DeltaManager
48_01_計算機及操作系統原理.avi
48_02_Linux操作系統原理.avi
48_03_CPU負載觀察及調優方法.avi
49_01_Linux內存子系統及常用調優參數.avi
49_02_Linux內存子系統及常用調優參數.avi
50_01_虛擬化技術基礎原理詳解.avi
50_02_Xen虛擬化及DomU的實現.avi
51_01_Xen基於iscsi共享實現實時遷移.avi
51_02_kvm虛擬化.avi
51_03_OpenStack.avi
52_01_openstack.avi
52_02_openstack.avi
52_03_Hadoop.avi
52_04_Hadoop.avi
53_01_Hadoop補充視頻之基本概念及安裝.avi
53_02_Hadoop補充視頻之基本概念及安裝.avi
53_03_Hadoop補充視頻之基本概念及安裝.avi
53_04_MySQL優化思路及框架.avi
53_05_SELinux基礎概念.avi
54_01_企業級監控系列之一——SNMP原理和實戰.avi
54_02_企業級監控系列之二——RRD-tools繪圖原理和應用.avi
54_03_企業級監控系列之三——cacti原理和安裝.avi
54_04_企業級監控系列之四——cacti配置和高級用法.avi
55_01_企業級監控系列之五——Nagios基礎和入門配置.avi
55_02_企業級監控系列之六——nagios高級應用及插件開發.avi
55_03_企業級監控系列之七——nagios高級應用及飛信報警功能.avi
56_01_RPM包製作1.avi
56_02_RPM包製作2.avi

加管理老師QQ開通公益學習許可權 1815759616 收起

『陸』 bash腳本編程需要哪些元素

1、命令,主要是指linux的命令,包括內部命令和外部命令。
2、bash語法,其實跟編程中的語法相同也分為順序結構、判斷結構、循環結構,萬變不離其宗。
3、linux系統知識,因為shell腳本是在linux平台運行的,所以對linux系統的一些知識還是很有必要掌握的。

『柒』 有哪些好用的bash 技巧

簡潔的bash編程技巧1) 檢查命令執行是否成功第一種寫法,比較常見:echoabcdee grep-q abcdif[ $? -eq0 ]; then echoFoundelse echoNot foundfi簡潔的寫法:ifechoabcdee grep-q abc; then echoFoundelse echoNot foundfi當然你也可以不要if/else,不過這樣可讀性比較差:[SunNov 04 05:58 AM] [kodango@devops] ~/workspace$echoabcdee grep-q abc && echoFound echoNot foundFound2) 將標准輸出與標准錯誤輸出重定向到/dev/null 第一種寫法,比較常見:1grepabctest.txt1>/dev/null2>&1常見的錯誤寫法:1grepabctest.txt2>&1 1>/dev/null簡潔的寫法:1grepabctest.txt&> /dev/null3) awk的使用舉一個實際的例子,獲取Xen DomU的id。常見的寫法:1sudoxm li grepvm_name awk'{print $2}'簡潔的寫法:1sudoxm li awk'/vm_name/{print $2}'4) 將一個文本的所有行用逗號連接起來假設文件內容如下所示:[SatNov 03 10:04 PM] [kodango@devops] ~/workspace$cat/tmp/test.txt123使用Sed命令:123[SatNov 03 10:14 PM] [kodango@devops] ~/workspace$sed':a;$!N;s//n/,/;ta'/tmp/test.txt1,2,3簡潔的寫法:123[SatNov 03 10:04 PM] [kodango@devops] ~/workspace$paste-sd, /tmp/test.txt1,2,35) 過濾重復行假設文件內容如下所示:[SatNov 03 10:16 PM] [kodango@devops] ~/workspace$sort/tmp/test.txt常用的方法:[SatNov 03 10:16 PM] [kodango@devops] ~/workspace$sort/tmp/test.txt uniq123簡單的寫法:[SatNov 03 10:16 PM] [kodango@devops] ~/workspace$sort/tmp/test.txt-u6) grep查找單詞假設一個文本的每一行是一個ip地址,例如[SatNov 03 10:20 PM] [kodango@devops] ~/workspace$cat/tmp/ip.list10.0.0.110.0.0.1210.0.0.123使用grep查找是否包括10.0.0.1這個ip地址。常見的寫法:[SatNov 03 10:22 PM] [kodango@devops] ~/workspace$grep'10.0.0.1/>'/tmp/ip.list10.0.0.1簡單的方法(其實這方法不見得簡單,只是為了說明-w這個參數還是很有用的)123[SatNov 03 10:23 PM] [kodango@devops] ~/workspace$grep-w '10.0.0.1'/tmp/ip.list10.0.0.1順便grep的-n/-H/-v/-f/-c這幾參數都很有用。7) 臨時設置環境變數常見的寫法:[SatNov 03 10:26 PM] [kodango@devops] ~/workspace$exportLC_ALL=zh_CN.UTF-8[六11月 03 10:26 下午] [kodango@devops] ~/workspace$date2012年11月 03日 星期六 22:26:55 CST簡潔的寫法:[六11月 03 10:26 下午] [kodango@devops] ~/workspace$unsetLC_ALL[SatNov 03 10:27 PM] [kodango@devops] ~/workspace$LC_ALL=zh_CN.UTF-8 date2012年11月 03日 星期六 22:27:43 CST在命令之前加上環境變更的設置,只是臨時改變當前執行命令的環境。8) $1,$2等位置參數的使用假設只想使用$2,$3..這幾個參數,常見的做法是:12shiftecho$@為什麼不這樣寫呢?1echo${@:2}9)退而求其次的寫法相信大家會有這種需求,當一個參數值沒有提供時,可以使用默認值。常見的寫法是:arg=$1if[ -z $arg]; then arg=0fi簡潔的寫法是這樣的:1arg=${1:-0}10)bash特殊參數–的用法假設要用grep查找字元串中是否包含-i,我們會這樣嘗試:[SatNov 03 10:45 PM] [kodango@devops] ~/workspace$echo'abc-i' grep-iUsage:grep[OPTION]... PATTERN [FILE]...Try'grep--help'formoreinformation.[SatNov 03 10:45 PM] [kodango@devops] ~/workspace$echo'abc-i' grep/-iabc-i簡潔的方法是:123[SatNov 03 10:45 PM] [kodango@devops] ~/workspace$echo'abc-i' grep-- -iabc-ibash中–後面的參數不會被當作選項解析。11)函數的返回值默認是最後一行語句的返回值#Check whether an item is a function#$1: the function name#Return: 0(yes) or 1(no)functionis_function(){ localfunc_name=$1 test`type -t $1 2>/dev/null`= function}不要畫蛇添足再在後面加一行return $?了。12) 將printf格式化的結果賦值給變數例如將數字轉換成其十六進制形式,常見的寫法是:12[SatNov 03 10:55 PM] [kodango@devops] ~/workspace$var=$(printf'%%%02x'111)簡單的寫法是:12[SatNov 03 10:54 PM] [kodango@devops] ~/workspace$printf-vvar '%%%02x'111看看printf的help[SatNov 03 10:53 PM] [kodango@devops] ~/workspace$help printf grep-A 1 -B 1 -- -vprintf:printf[-vvar] format[arguments] Formatsand prints ARGUMENTS under control of the FORMAT.-- Options: -vvar assign the output to shell variable VAR rather than displayit on the standard output13)列印文件行列印文件的第一行:1head-1 test.txt列印文件的第2行:1sed-n '2p'test.txt列印文件的第2到5行:1sed-n '2,5p'test.txt列印文件的第2行始(包括第2行在內)5行的內容:1sed-n '2,+4p'test.txt列印倒數第二行:12$tail-2 test.txt head-1$tac test.txt sed-n '2p'14)善用let或者(())命令做算術運算如何對一個數字做++運算,可能你會這樣用:12a=1a=`expra + 1`為何不用你熟悉的:123a=1leta++leta+=215)獲取軟連接指定的真實文件名如果你不知道,你可能會這樣獲取:123[SatNov 03 11:12 PM] [kodango@devops] ~/workspace$ls-l /usr/bin/python awk-F'->''{print $2}' tr-d ''/usr/bin/python2如果你知道有一個叫readlink的命令,那麼:123[SatNov 03 11:13 PM] [kodango@devops] ~/workspace$readlink /usr/bin/python/usr/bin/python216)獲取一個字元的ASCII碼[SatNov 03 11:14 PM] [kodango@devops] ~/workspace$printf'%02x''+2b[SatNov 03 11:30 PM] [kodango@devops] ~/workspace$echo-n '+' od -tx1 -An tr-d ''2b17)清空一個文件常見的用法:1echo> test.txt簡單的寫法:1>test.txt18) 不要忘記有here document下面一段代碼:grep-v1 /tmp/test.txt whilereadline; do leta++ echo--$line--doneechoa:$a執行後有什麼問題嗎?[SunNov 04 05:35 AM] [kodango@devops] ~/workspace$sh test.sh--2----3--a:發現a這個變數沒有被賦值,為什麼呢?因為管道後面的代碼是在在一個子shell中執行的,所做的任何更改都不會對當前shell有影響,自然a這個變數就不會有賦值了。換一種思路,可以這樣做:grep-v1 /tmp/test.txt> /tmp/test.tmpwhilereadline; do leta++ echo--$line--done< /tmp/test.tmpechoa:$arm-f /tmp/test.tmp不過多了一個臨時文件,最後還要刪除。這里其實可以用到here document:b=1whilereadline2; do letb++ echo??$line2??done< < EOF`grep-v1 /tmp/test.txt`EOFechob: $bhere document往往用於需要輸出一大段文本的地方,例如腳本的help函數。19)刪除字元串中的第一個或者最後一個字元假設字元串為:12[SunNov 04 10:21 AM] [kodango@devops] ~/workspace$str=aremoveb可能你第一個想法是通過sed或者其它命令來完成這個功能,但是其實有很簡單的方法:[SunNov 04 10:24 AM] [kodango@devops] ~/workspace$echo${str#?}removeb[SunNov 04 10:24 AM] [kodango@devops] ~/workspace$echo${str%?}aremove類似地,你也可以刪除2個、3個、4個有沒有一次性刪除第一個和最後一個字元的方法呢?答案當然是肯定的:123[SunNov 04 10:26 AM] [kodango@devops] ~/workspace$echo${str:1:-1}remove關於這些變數替換的內容在bash的man手冊中都有說明。20)使用逗號join數組元素假設數組元素沒有空格,可以用這種方法:[SunNov 04 10:14 AM] [kodango@devops] ~/workspace$a=(1 2 3)$b=${a[*]}[SunNov 04 10:15 AM] [kodango@devops] ~/workspace$echo${b///,}1,2,3假設數組元素包含有空格,可以借用printf命令來達到:[SunNov 04 10:15 AM] [kodango@devops] ~/workspace$a=(1 234)[SunNov 04 10:15 AM] [kodango@devops] ~/workspace$printf,%s${a[@]} cut-c2- 1,23,421) Shell中的多進程在命令行下,我們會在命令行後面加上&符號來讓該命令在後台執行,在shell腳本中,使用(cmd)可以讓fork一個子shell來執行該命令。利用這兩點,可以實現shell的多線程:job_num=10functiondo_work(){ echoDo work..}for((i=0; i<job_num ;i++)); do echoFork job $i (do_work)&donewait #wait for all job doneechoAll job have been done!注意最後的wait命令,作用是等待所有子進程結束。22) bash中alias的使用alias其實是給常用的命令定一個別名,比如很多人會定義一下的一個別名:1aliasll='ls-l'以後就可以使用ll,實際後執行的是ls -l。現在很多發行版都會帶幾個默認的別名,比如:aliasgrep='grep--color=auto' # 帶顏色顯示aliasls='ls--color=auto'# 同上aliasrm='rm-i' # 刪除文件需要確認alias在某些方面確實提高了很大的效率,但是也是有隱患的,這點可以看我以前的一篇文章終端下肉眼看不見的東西。那麼如何不要alias,而是用本來的意思呢?答案是使用轉義:12/ls/grep在命令前面加一個反斜杠後就可以了。這里要插一段故事,前兩天我在shell腳本中定義了下面的一個alias,假設位於文件util.sh:#!/bin/bash...aliasssh='ssh-o StrictHostKeyChecking=no -o LogLevel=quiet -o BatchMode=yes'...後面這串ssh選項是為了去掉一些warning的信息,不提示輸入密碼等等。具體可以看ssh的文檔說明。我自己測試的時候好好的,當時我同事跑得時候卻依然有報Warning。我對比了下我們兩個人的用法:12shutil.sh #我的./util.sh #他的大家應該知道,直接./util.sh執行,shell會去找腳本第一行的shebang中給定的解釋器去執行改腳本,所以第二種用法相當於直接用bash來執行。那想必是bash/sh對alias是否默認這一點上是有區別的了(可能是bash版本的問題,RHEL 5U4)。翻閱了下Bash的man手冊,發現可以通過設置expand_aliases選項來打開alias的功能,默認在非互動式Shell下是關閉的(什麼是互動式登錄Shell)。修改下util.sh,打開這個選項就Ok了:#!/bin/bash...#Expand aliases in scriptshopt-s expand_aliasesaliasssh='ssh-o StrictHostKeyChecking=no -o LogLevel=quiet -o BatchMode=yes'...23)awk列印除第一列之外的其他列awk用來截取輸入行中的某幾列很有用,當時如果要排除某幾列呢?例如有如下的一個文件:$cat/tmp/test.txt12 3 4 51020 30 40 50可以用下面的代碼解決(來源):123$awk'{$1=;print $0}'/tmp/test.txt23 4 52030 40 50但是前面多了一個空格,可以用cut命令稍微調整下:123$awk'{$1=;print $0}'/tmp/test.txt cut-c2-23 4 52030 40 50附幾則小技巧:1)sudo iptables -L -n vim -2)grep -v xxx vim -3)echo $’/4)set — 1 2 3; echo $@5)搜索stackoverflow/superuser等站點

閱讀全文

與bash編程系列相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:755
蘋果郵件無法連接伺服器地址 瀏覽:958
phpffmpeg轉碼 瀏覽:669
長沙好玩的解壓項目 瀏覽:140
專屬學情分析報告是什麼app 瀏覽:562
php工程部署 瀏覽:831
android全屏透明 瀏覽:730
阿里雲伺服器已開通怎麼辦 瀏覽:801
光遇為什麼登錄時伺服器已滿 瀏覽:300
PDF分析 瀏覽:483
h3c光纖全工半全工設置命令 瀏覽:141
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:777
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:148
伊克塞爾文檔怎麼進行加密 瀏覽:889
app轉賬是什麼 瀏覽:163