shell指令碼學習指南[一](Arnold Robbins & Nelson H.F. Beebe著)_linux shell

來源:互聯網
上載者:User

第一章略過,下邊從第二章開始,大家懂得。
ps:這裡發生了一件非常當我蛋疼的事情,非常!已經碼文章碼到第四章了,悲劇的按錯瀏覽器按鈕重新整理掉,怎麼也找不回來之前寫的東西了。想死!算了,複習一邊吧。以下全文均屬自己總結書寫,有錯誤的地方也未必是書中錯誤(當然也有可能是書中錯誤,但是我都會親自操作滴),可能是我寫錯,請大牛指正。

第二章入門

因為第二遍寫,就簡單快速的寫吧,盡量寫清楚。大家都知道的終端命令cd啊 chmod啊 who啊之類的組合在一起加上一些控制語句,變數什麼的就成shell編程了,給出一個簡單例子:

複製代碼 代碼如下:

$ cat > nusers
#! /bin/sh
who | wc -l
^D
$ chmod +x nusers
$ ./nusers

上邊就是nusers檔案就是一個完整的shell指令碼了,功能是查詢多少使用者登入系統。cat >nusers 重新導向到nusers檔案輸入資料流, #! 這句 ,#號之後都是注釋,但是#!是會被解譯器讀取的,因為這句告訴了系統應該使用什麼解譯器,這裡就是 /bin/sh 。^D是按ctrl+d 結束輸入,chmod增加可執行許可權,最後就是運行自己寫的指令碼。這樣就是一個完整的編寫到運行使用的過程了。你入門了木有?(額~如果木有的話,那換個文章再看看吧)

現在我們來改進一下,為了讓我們執行自己的程式更像系統內建命令那樣,我們可以修改系統內容變數PATH,修改過windows的童鞋都知道,linux也一樣,是為了讓系統搜尋命令的時候有個搜尋路徑依據。你可以輸出一下看看先:echo $PATH .結果就是輸出一大串以:為分隔字元的字串,我們給他重新賦值,假設我們編寫的shell代碼存在使用者目錄下的myshell檔案夾內,那麼我們就這樣賦值: PATH=$PATH:$HOME/myshell 這樣我們就可以直接運行nusers命令獲得使用者登入數目的資訊了。

這裡學習兩個命令,不好意思你想錯了,不是who 和 wc,而是從最基本的輸出hello,world開始嘛,所以先學echo和printf,前者十分簡單,會輸出所有參數,如:echo hello,world 。會c語言的朋友可以開心了,因為你不用再學習printf了,機會完全一樣,比如:printf "hello,%s\n",world ,這樣就會輸出hello,world然後換行(不會有不會c的童鞋吧?)。

另外再說一下之前出現的 > | < (不是表情 - -! (這個是)),這是基本的I/O重新導向了,用過windows裡cmd命令並且知道的也可以跳過了。 > 輸出重新導向 。 <輸入重新導向 。 | 管道,會把符號前的輸出資訊當作符號後的輸入資訊。另外還有>> << ,與單個的區別就是單個的會覆蓋原本存在的檔案,沒有就建立。雙個的不會覆蓋,只在已有的檔案後邊增添。

為了練習這個重新導向,學習一個tr命令,主要用於轉換刪除濃縮字元。
文法:tr [options] source-char-list replace-char-list
選項:-c 取source反義,即tr要轉換的字元未列在source裡,通常-d -s配合使用
-d 自標準輸入刪除source-char-list裡所列的字元,而非轉換。
-s 濃縮重複的字元。
簡易配合重新導向練習練習。看看怎麼濃縮的,怎麼替換的。

這裡介紹兩個特殊檔案:/dev/null 和 /dev/tty,前者傳送到此檔案的資料都會被系統丟棄,類似垃圾桶。從中讀取資料則只能讀到null。另一個/dev/tty,當程式開啟此檔案時,linux會自動將它重新導向到一個終端(控制台或串列口或一個網路與視窗登入的偽終端等)再與程式結合。這在程式必須讀取人工輸入時特別有用,也可以用來產生錯誤資訊。例:

複製代碼 代碼如下:

printf "Enter new password:" #提示輸入
stty -echo #關閉自動列印輸入字元功能
read pass < /dev/tty #讀取密碼
printf :Enter again:" #再次提示輸入
read pass2 < /dev/tty #再次讀取
stty echo #開啟自動列印輸入字元功能

stty(set tty)命令用來控制終端(或視窗)的各種設定。

現在已經能夠寫自己的shell指令碼,也能夠像系統內建命令一樣調用了,但是還缺點什麼,對,就是傳參數,給自己的指令碼程式傳遞參數,使有更豐富的功能實現。

指令碼裡參數擷取很簡單,第一個參數就是$1,第二個$2,但是超過9的都用大括弧把數字括起來,如${10}。下邊寫個完整的指令碼程式:

複製代碼 代碼如下:

$ cat > finduser
#! /bin/sh
#finduser ---查看指定使用者是否登入
who | grep $1
^D
$ chmod +x finduser
$ finduser root

前提是前邊你也該過環境變數PATH。(不知道怎麼改請往前找)

我們已經能夠寫一些指令碼的,但是難免會出錯,不能達到預期,我們需要像c++那樣debug,可以直接在命令列裡執行sh -x finduser 來開啟執行跟蹤功能。
也可以在指令碼裡用set -x命令將執行跟蹤的功能開啟,然後再用set +x來關閉該功能。

個人原創,轉載請註明:三江小渡

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.