天天看點

shell 目錄下檔案名放入循環_Linux作業系統——難道你不懂Bash、shell嗎,教你寫bash腳本...

一、何謂 Bash?

Bash(Bourne Again shell),是目前 Linux 上最流行的 Shell。

Shell,指令語言解釋器(command-language interpreter)

Bash 相當于 DOS 系統的 Command.exe。

Linux 上還有一些較流行的 Shell,如 tcsh 、pdksh 等。

echo $BASH_VERSION 可檢查目前所用的 Shell 版本。

若傳回出錯資訊則表明目前的 Shell 不是 Bash,可執行:

exec /bin/bash 令系統使用 Bash

(/etc/shells 檔案注冊了目前系統所能使用的 shell 清單。)

二、 在一行上順序執行多個指令

可用分号将幾個指令串聯,如:

mkdir mydir; cd mydir

注意:⑴用分号串聯的指令個數沒有固定限制;

⑵各指令依順序執行,并非同時運作;

⑶無論前一個指令是否成功,都将執行下一個指令。

三、 引号和轉義

•Linux 系統中需要轉義的例子:

⑴$用來表示系統環境變量,可我們需要$的本來文字意義;

⑵顯示出含*、?的檔案名,比如 a?*,不希望按通配符解釋。

這時就要使用轉義符“”,來取特殊字元的文字意義,例:mkdir a?*; ls –l a?* 建立 a?*目錄并顯示其中内容

(思考:怎樣顯示 a?*目錄本身屬性?)

•單引号包覆的字元或字元串隻具文字意義;

雙引号包覆的字元或字元串允許特殊字元保持其特殊意義。

例:

echo $PATH; 将顯示出目前搜尋路徑

echo ”$PATH” 同樣将顯示出目前搜尋路徑

echo ‘$PATH’ 将顯示出“$PATH”

echo $PATH 同樣将顯示出“$PATH”

(何時需使用單引号或雙引号?如,包括空格的字元串!)

四、 裝置轉向(或稱輸入/輸出重定向)

Linux 檔案系統的标準裝置有标準輸入、标準輸出、标準錯誤。

裝置名稱 縮寫 序号 用途

預設連接配接

标準輸入 stdin 0

讀資料

鍵盤

标準輸出 stdout 1

顯示程式輸出

顯示器

标準錯誤 stderr 2

異常時顯示錯誤和警告

顯示器

裝置的轉向就是改變其輸入/輸出的裝置指向,例如将鍵盤輸

入轉向為檔案輸入、将輸出顯示由顯示器轉向為檔案等。

①輸出轉向

輸出轉向操作符是>和>>,分别用于建立和追加檔案。

例:ls –l /dev/hd*>result.txt

将原本輸出到螢幕的結果轉存入新檔案 result.txt。ls –l kkk>>result.txt

将 kkk 目錄下的檔案清單追加到 result.txt 中。

可是,若 kkk 目錄不存在,出錯資訊因未轉向而仍出現在螢幕上。标準錯誤的重定向操作符是“2>”或“2>>”

(其實标準輸出重定向操作符“>”是“1>”的省略形式)

若要将輸出轉到新檔案 result.txt,并且當有錯誤發生時記錄到 error.txt 檔案中,應該:

ls –l kkk>result.txt 2>error.txt

若要将标準輸出和标準錯誤都轉向到同一個檔案,應該:

ls –l kkk>result.txt 2>&1

2>&1 句法告訴 Bash 那些本來輸出到檔案描述符 2(标準錯誤)的内容傳送到檔案描述符 1(标準輸出),由于檔案描述符 1 已被轉向到檔案,是以标準錯誤也被送入到同一檔案中。鑒于該操作極其普遍以至于 Bash 有一專門簡化用法:

ls –l kkk &>result.txt

②輸入轉向

輸入轉向的操作符是“

輸入轉向可将原本應由鍵盤輸入的資料改由檔案或其它輸入裝置輸入。例如以前學過的廣播指令 wall,其格式是:

wall [廣播資訊]

若隻鍵入 wall 就回車,程式将等待鍵盤輸入,直到回車再按 EOF(ctrl+d)。但為簡化經常性的資訊釋出,我們可以建立一個包含資訊的的文本檔案 mes.txt,執行:

wall

③說明

⑴其它教科書上一般都用 cat、wc 等指令來解釋标準輸入轉向,這些指令在無參數執行時确實是從标準輸入裝置輸入(這可使其作為過濾器),但有檔案名作參數時就直接從該檔案輸入,而不必非要加轉向符。即cat a.txt和cat

⑵ DOS 中标準輸入和輸出裝置是 CON,标準列印輸出是PRN,執行 copy con a.txt 将接受其後的鍵盤輸入,當按F6 或 ctrl+z 時生成 a.txt 檔案内容。同 DOS 用法類似,Linux 也可以使用 cp /dev/stdin a.txt 指令去建立文本檔案,或者使用 cp a.txt /dev/stdout 指令去顯示文本檔案内容。所不同的是 Linux 系統的檔案結束符是 ctrl+d 而不是 DOS 中的 crtl+z。

五、 指令管道

使用管道操作符“|”将一個以上的指令或程式連接配接起來,前一個的輸出作為後一個的輸入,如此形成一個管道。

例:ls –l /dev|more 将目錄清單分頁顯示(more 指令後述)

(注:管道中的各個指令或程式是同時運作的。)

六、 曆史表檔案.bash_history

•每個使用者的主目錄下都有一個名為.bash_history 文本檔案,該檔案記載了使用者操作的曆史記錄。

•Bash 為每個使用者維護着一個曆史表。

•使用者登入時該檔案内容加載到曆史表,登出時再更新該檔案

• history 指令可以列出使用者的操作記錄,即曆史表。

曆史表的每一行稱之為一個事件,行首數字表示事件号。

•用“!”加事件号作指令可以簡便地重複該曆史事件,如:

!385

• 特殊操作符!!用于重複最近一個指令。

• 更常用的技巧:在 bash 下可直接用上光标鍵回溯操作曆史。

七、 shell 函數

bash 允許使用者自定義指令函數,其格式為:

name() { command_list;} 即:函數名() { 指令清單;}

注意:⑴左花括号後要有一個空格,規定如此,未必有道理;

⑵指令清單可以是多個指令,每個指令後别忘有分号;

⑶函數中可使用$*提取函數的參數。

例:dir() { ls –ld $*;}

以後就可以用指令 dir 來列出指定目錄中的檔案名和目錄名,

如:dir /etc 顯示/etc 目錄中的檔案和目錄清單

八、 指令補全功能

tab 鍵可用來對指令補全,是 Linux 操作中最常用的技巧之一。

例:在安裝一章我們曾接觸過一條用于文檔安裝的指令:

mount -t iso9660 -o loop /opt/RedhatLinux9.0 文檔 CD.ISO /mnt/iso

這樣長的指令且檔案名夾雜漢字,輸起來十分不易。

當然可先用 mv 指令将檔案更名為一個簡單的檔案名,但利用補全 bash 的功能更為簡便:

當輸到“mount -t iso9660 -o loop /opt/R”時按 tab 鍵,系統會自動依據查找結果補全檔案名,簡化了不少操作。

若系統沒有給予完全補全,說明存在近似的檔案需要選擇,例:

假設/opt 目錄中還有一個 Redflag.iso,則光标會停在 Red 後,此時需要按 h 或 f 進行下一步選擇。

九、 作業控制

程序可以簡單地了解為處于排程中的程式,

作業可能有多個程序(如管道)。

①ps 檢視程序狀态指令

執行 ps 指令可以報告系統中程序的運作狀況。如:

PID TTY TIME CMD

2565 tty1 00:00:00 bash

2597 tty1 00:00:00 ps

即系統正在運作兩個程序,bash 和 ps 本身。

shell 目錄下檔案名放入循環_Linux作業系統——難道你不懂Bash、shell嗎,教你寫bash腳本...
shell 目錄下檔案名放入循環_Linux作業系統——難道你不懂Bash、shell嗎,教你寫bash腳本...

②jobs 顯示目前尚未完成的作業

顯示如下:

[2]+Done find / -name fox.jpg

[1]-Stopped man ls&

[]中是作業号;加号表示是目前預設作業;Running、Done、

Stopped 分别表示正在運作、完成、挂起。

③在背景執行指令的方法

在指令行的末尾加上一個&。

将運作時間較長的程式放在背景運作可以騰出前台繼續進行其它操作。如:查找 fox.jpg 檔案是個較長的過程,可以使用指令:

find / -name fox.jpg & 使其在背景運作,系統将顯示:[1] 2551

[1]是任務的背景作業号,2551 是程序辨別 PID。

(注:宜改用第 13 章的示例程式 beep1 來示範背景操作)。

④作業的前背景切換

fg 将作業切換到前台

bg 将作業切換到背景

ctrl+z 挂起目前作業

fg、bg 預設針對目前作業。可使用參數指定其它作業,如 bg %1 将 1 号作業放于背景。

背景的作業無法接收鍵盤的輸入,若需要接收鍵盤的輸入則将被挂起。

實際上并不能直接使用 fg 指令将目前前台作業轉為背景運作,因為這時的鍵盤輸入被視為對作業的輸入而不是對shell 的輸入。解決方法是:

先 ctrl+z 挂起目前作業,再執行 bg 指令。

⑤ sleep 使程序暫停一段時間

格式:sleep 以秒為機關的時間值

此指令大多用于 shell 程式設計中,使兩條指令執行之間停頓指定的時間。

例:sleep 100; who |grep ‘z3’

使程序先停 100 秒,再檢視 z3 是否正在使用系統。⑥ kill 向程序發信号

•信号概念:信号是一種機制,程序通過信号知道系統中正

在出現的事件,程序在任何時候都能接收到信号。信号通常用來要求程序中斷正常運作而做某種操作,大多數程序在收到信号時的預設操作都是結束接收信号的程序,或其它操作。

shell 目錄下檔案名放入循環_Linux作業系統——難道你不懂Bash、shell嗎,教你寫bash腳本...

•kill 指令用作向程序發信号,常用來終止程序。

終止前台程序可按 ctrl+c,但終止背景程序需用 kill。

kill 的指令格式:

kill [信号名或信号值] 程序 PID

如:kill 999 發-15 信号終止 PID=999 的程序

若不成功,可:kill –9 999 殺死 PID=999 的程序。

•使用 killall 指令代替 kill 可直接指定程式名:

例:killall –9 find

殺死所有與 find 指令有關的程序執行個體,盡管這些執行個體有

不同的 PID。

• kill 0 可撤消所有背景作業

十、 監視系統負荷

top 指令用來動态顯示系統的運作狀況。

按 q 結束監視退回 shell。

shell程式設計

一、 編寫與執行 Shell 腳本

• shell 腳本的作用類似于 DOS 的批處理檔案,但無檔案名規定。

• shell 腳本是文本檔案,可用 vi、gedit 或其它文本編輯去建立。

• 腳本的首行應是#!/bin/sh,指明該用什麼程式來解釋該腳本。

• 使用 chmod +x 指令為腳本檔案增加可執行屬性

• 執行:./腳本檔案名(除非修改主目錄下的.bash_profile 檔案)

二、 部分要點的執行個體導引

①指令的串聯:||和&&

例:cd hhh||mkdir hhh; cd hhh

②.指令,表示在目前系統環境下執行後面的指令

③空裝置/dev/null 無底洞而不是廢紙簍

④系統變量

⑤eval 求值,例:eval chmod 777 ~$1

$( ) 将指令的結果賦給變量,例:result=$(ls –l /boot)

$(( )) 數學計算,例:echo $((2+3))

三、 條件表達式和流程控制

對于熟悉程式設計概念的專業人士,不過是另外一套規則約定。需

要時不難自學,這裡暫時從略。

繼續閱讀