2020-04-18
乙個 shell 指令碼就是乙個包含一系列命令的檔案。shell 讀取這個檔案,然後執行檔案中的所有命令,就好像這些命令已經直接被輸入到了命令列中一樣。大多數能夠在命令列中完成的任務也能夠用指令碼來實現,同樣地,大多數能用指令碼實現的操作也能夠在命令列中完成。
#!/bin/bash
# this is our first script.
echo 'hello world!'
我們指令碼中的第一行文字有點兒神秘。它看起來它應該是一條注釋,因為它起始於乙個#
符號,但是它看起來太有意義,以至於不僅僅是注釋。事實上,這個#!
字串行是一種特殊的結構叫做shebang
。這個shebang
被用來告訴作業系統將執行此指令碼所用的直譯器的名字。每個 shell 指令碼都應該把這一文字行作為它的第一行。
第二行是乙個注釋,文字行中,#
符號之後的所有字元都會被忽略。關於 shell 指令碼中的注釋,它們也可以出現在文字行的末尾,像這樣:
echo 'hello world!' # this is a comment too
下一步我們要做的事情是讓我們的指令碼可執行。
[root@vm_0_7_centos shell_script]# vim hello_world
[root@vm_0_7_centos shell_script]# ll
total 4
-rw-r--r-- 1 root root 60 apr 18 09:49 hello_world
[root@vm_0_7_centos shell_script]#
[root@vm_0_7_centos shell_script]# chmod 755 hello_world
[root@vm_0_7_centos shell_script]# ll
total 4
-rwxr-xr-x 1 root root 60 apr 18 09:49 hello_world
當設定了指令碼許可權之後,我們就能執行我們的指令碼了:
[root@vm_0_7_centos shell_script]# ./hello_world
hello world!
[root@vm_0_7_centos shell_script]# hello_world
-bash: hello_world: command not found
為什麼會這樣呢?什麼使我們的指令碼不同於其它的程式?結果證明,什麼也沒有。我們的指令碼沒有問題。是指令碼儲存位置的問題。我們知道path
環境變數及其在系統查詢可執行程式方面的作用。如果沒有給出可執行程式的明確路徑名,那麼系統每次都會搜尋一系列的目錄,來查詢此可執行程式。這個/bin
目錄就是其中乙個系統會自動搜尋的目錄。這個目錄列表被儲存在乙個名為path
的環境變數中。這個path
變數包含乙個由冒號(:
)分隔開的目錄列表。我們可以檢視 path 的內容:
[me@linuxbox ~]$ echo $path
/home/me/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:
/bin:/usr/games
這裡我們看到了我們的目錄列表。如果我們的指令碼位於此列表中任意目錄下,那麼我們的問題將會被解決。注意列表中的第乙個錄/home/me/bin
。大多數的 linux 發行版會配置path
變數,讓其包含乙個位於使用者家目錄下的bin
目錄,從而允許使用者能夠執行他們自己的程式。所以如果我們建立了乙個bin
目錄,並把我們的指令碼放在這個目錄下,那麼這個指令碼就應該像其它程式一樣開始工作了:
[me@linuxbox ~]$ mkdir bin
[me@linuxbox ~]$ mv hello_world bin
[me@linuxbox ~]$ hello_world
hello world!
如果這個path
變數不包含這個目錄,我們能夠輕鬆地新增它,通過在我們的.bashrc
檔案中包含下面這一行文字:
[root@vm_0_7_centos shell_script]# export path=~/bin:"$path"
當做了這個修改之後,它會在每個新的終端會話中生效。為了把這個修改應用到當前的終端會話中,我們必須讓 shell 重新讀取這個.bashrc
檔案。這可以通過「sourcing」.bashrc
檔案來完成:
[me@linuxbox ~]$ . .bashrc
這個點(.
)命令是source
命令的同義詞,乙個 shell 內建命令,用來讀取乙個指定的 shell 命令檔案,並把它看作是從鍵盤中輸入的一樣。
注意:在 ubuntu 系統中,如果存在這個∼/bin
目錄,當執行使用者的.bashrc
檔案時,ubuntu 會自動地新增這個∼/bin
目錄到path
變數中。所以在 ubuntu 系統中,如果我們建立了這個∼/bin
目錄,隨後退出,然後再登入,一切會正常執行。
∼/bin
目錄是存放為個人所用指令碼的好地方。如果我們編寫了乙個指令碼,系統中的每個使用者都可以使用它,那麼這個指令碼的傳統位置是/usr/local/bin
。系統管理員使用的指令碼經常放到/usr/local/sbin
目錄下。大多數情況下,本地支援的軟體,不管是指令碼還是編譯過的程式,都應該放到/usr/local
目錄下,而不是在/bin
或/usr/bin
目錄下。這些目錄都是由 linux 檔案系統層次結構標準指定,只包含由 linux 發行商所提供和維護的檔案。
開啟語法高亮。通過這個設定,當檢視指令碼的時候,不同的 shell 語法元素會以不同的顏色顯示。這對於識別某些程式設計錯誤很有幫助。並且它看起來也很酷。注意為了這個功能起作用,你必須安裝了乙個完整的 vim 版本,並且你編輯的檔案必須有乙個shebang
,來說明這個檔案是乙個 shell 指令碼。如果對於上面的命令,你遇到了困難,試試:set syntax=sh
。
:set hlsearch
開啟這個選項是為了高亮查詢結果。比如說我們查詢單詞「echo」。通過設定這個選項,這個單詞的每個例項會高亮顯示。
:set tabstop=4
設定乙個tab
字元所佔據的列數。預設是 8 列。把這個值設定為 4(一種常見做法),從而讓長文字行更容易適應螢幕。
:set autoindent
開啟 「auto indent」 功能。這導致 vim 能對新的文字行縮排與剛輸入的文字行相同的列數。對於許多程式設計結構來說,這就加速了輸入。停止縮排,輸入ctrl-d
。
通過把這些命令(沒有開頭的冒號字元)新增到你的∼/.vimrc
檔案中,這些改動會永久生效。
第十八節 快取
本節將通過對 2019 11 05 mynopcommerce vs19core2.2nop4.20 不刪,014 新增一些中介軟體的定義 程式進行重構,從而來實現授權功能。重構nop.web.framework.infrastructure.dependencyregistrar 類,重新定義 r...
程式設計第十八題
rpg girls今天和大家一起去遊樂場玩,終於可以坐上夢寐以求的過山車了。可是,過山車的每一排只有兩個座位,而且還有條不成文的規矩,就是每個女生必須找個個男生做partner和她同坐。但是,每個女孩都有各自的想法,舉個例子把,rabbit只願意和xhd或pqk做partner,grass只願意和l...
作業第十八周
1 請列出 nginx 常用模組的各個優缺點以及區別 ngx http auth basic module 實現基於使用者的訪問控制,使用basic機制進行使用者認證,優點 使用登陸對話方塊的方式實現使用者認證,缺點 認證檔案依賴httpd tools軟體包。ngx http stub status...