Linux中腳本的使用方法
一、前言
關於Linux中的腳本的用法,一直沒有時間去好好地總結,正好今天下雨,就好好的整理一下思路吧,其實精通了一門語言,比如C語言,學習其他語言需要的成本是非常少的,同樣的腳本作為一種比較簡易的語言,只要知道了語法,我們在通過幾個例子好好的理解和掌握一下常規的使用,這樣就等於是入門了,之后要想精深的話,其實更應該學習一下Linux中的命令,比如三劍客、文件操作的命令、進程管理的命令、重定向、管道等,這樣我們也算是能夠登堂入室了,不管是什么語言,最重要的是使用,不用來使用的語言,學習是毫無意義的,過不了多長時間就會忘記的。
二、Linux腳本的使用
2.1、腳本的運行
腳本可以很簡單,其實就是將Linux中的命令配上一定的語法去展現出來,下面我們看一個最簡單的腳本,因為筆者是在windows中操作的,安裝的Git里面就自帶有Linux腳本的運行環境(MinGW64),其實和Linux里面是一樣的,所以大家注意區分即可。
name='zyr' echo 'hello,zyr'
(1)bash/sh 腳本名.sh
其中sh是bash這個程序的軟連接,需要找到bash再執行,因此執行的要稍微慢一點,當腳本文件本身沒有可執行權限時常使用的方法,使用ll命令可以看到文件權限屬性x位為-號;或者腳本文件開頭沒有指定解釋器時需要使用的方法,將重新啟動一個子shell(進程)來執行命令。從運行也可以看出來,這個$name根本就不是我們設置的,只是這個系統中已經設置的,說明是重新啟動了一個shell(子進程)來完成的,shell腳本執行完后子shell環境隨即關閉,然后又回到父shell中。這樣也好理解,因為如果凡事都需要shell自身來完成的話,有可能就阻塞了后續的執行了,這是一種折中的方法。
(2)path/腳本名.sh
如果是在當前文件夾下,需要使用 ./腳本名.sh 。使用這種方式需要腳本有執行權限,具體方法為:chmod a+x script-name。然后通過執行腳本絕對路徑或者相對路徑就可以執行腳本了。在生產環境中,運維人員由於忘記為該腳本設置可執行權限,然后直接使用,導致出錯,將重新啟動一個子shell(進程)來執行命令。因此,推薦第一種 bash script-name。出乎意料的,我們在沒有執行權限的時候竟然運行成功了,這說明了什么,只能說明我們使用的這個MinGw64權限太大了。在Linux環境中就需要修改權限了。同樣的也是重新啟動了一個子進程。
(3)source script-name或者 . script-name
source或者“.”命令的功能是:讀入腳本並執行腳本,即在當前Shell中執行source或“.”加載並執行的相關腳本文件的命令及語句,而不是產生一個子Shell來執行文件中的命令。可以看到我們使用這種命令實現了在本shell中執行該腳本的功能,正確的輸出了name。
2.2、腳本規范的寫法
在上面我們使用的腳本是不規范的,因為我們沒有在開頭描寫我們要使用什么解釋器來解釋和執行,因此在正規的場景之中,我們需要寫上這些信息,並且使用第一種方式來執行。一個規范的Shell腳本在第一行會指出由哪個程序(解釋器)來執行腳本中的內容,這一行內容在Linux bash的編程一般為:#!/bin/bash或#!/bin/sh 。
(1)在Shell中如果一行的第一個字母是#,則是注釋,但是寫在第一行,則不是腳本注釋行,如果寫在某個命令之后,則變成注釋行。
(2)sh為bash的軟鏈接,大多數情況下,腳本的開頭使用“#!/bin/bash”和“#!/bin/sh”是沒有區別的,但更規范的寫法是在腳本的開頭使用“#!/bin/bash”。
#!/bin/bash name='zyr' #定義變量 echo 'hello,zyr' #輸出字符串
2.3、腳本的語法
注意事項:
A1、當變量名被其他字符串混淆的時候,需要加{}
A2、對變量賦值的時候,在賦值號‘=’的左右不要留下空格
A3、在使用echo輸出的時候,需要使用雙引號""才能夠將變量轉換成數值輸出出去,不然將會按照字符串處理。單引號更嚴格一些,可以防止任何變量擴展。雙引號可以防止通配符擴展但允許變量擴展。
2.3.1、分支(判斷)語句的用法
比如我們下面接收用戶輸入的參數,然后將這些參數顯示出來並且對系統變量進行判斷的腳本:
1 #!/bin/sh 2 3 4 #提示“請輸入姓名”並等待30秒,把用戶的輸入保存入變量name中 5 read -t 30 -p "請輸入用戶名稱:" name 6 #echo -e 處理特殊字符,如換行 7 echo -e "\n" 8 echo "用戶名為:$name" 9 #提示“請輸入密碼”並等待30秒,把用戶的輸入保存入變量age中,輸入內容隱藏 10 read -t 30 -s -p "請輸入用戶密碼:" pw 11 echo -e "\n" 12 echo "用戶密碼為:$pw" 13 #提示“請輸入性別”並等待30秒,把用戶的輸入保存入變量sex中,只接受一個字符輸入 14 read -t 30 -n 1 -p "請輸入用戶性別:" sex 15 echo -e "\n" 16 echo "性別為$sex" 17 18 19 #注意if的空格以及[]里面的空格 20 if [ "$SHELL" = "/bin/bash" ];then 21 echo "SHELL is : $SHELL" 22 else 23 echo "login shell is $SHELL" 24 fi
可以看到根據腳本的不同命令,shell能夠正確的執行並且顯示相應的結果,同樣的,這里要說一下if語句,在編寫shell的時候,如果是在windows里面,我們最好使用sublime來編輯,這樣可以很容易的發現出現的錯誤,比如說if語句,如果不注意空格,那么將會出錯,在sublime中是能夠看到提示的,如果是在Linux之中,我們就使用vim或者gedit這些都能智能提示的。
比如說下面的就是錯誤的,必須有空格才能識別完整,好的編輯器能夠事半功倍:
當然if語句也有其他的寫法,比如使用&&和||來表示的,根據我們的需要,再一點點的掌握。
2.3.2、循環語句的用法
接下來我們看一下while循環:
1 #!/bin/bash 2 3 fileName=zyr.secret 4 count=`cat $fileName | wc -l` 5 #下面是一個管道,下面循環讀文件中的每一行 6 cat $fileName | 7 while read line 8 do 9 user=`echo $line|awk -F ':' '{print $1}'` 10 #代表以 :分段$1就是取第1段 11 uid=`echo $line|awk -F ':' '{print $3}'` 12 echo "hello, $user Your UID is $uid" 13 done 14 echo "====User_count:$count====" 15 #前面求得的用戶數
zyr:12:pw23 lsx:34:pw123 default:134:pw223
當然也可以使用for語句,比如下面的語句是創建文件夾,並且在文件夾里循環創建文件。
#!/bin/sh cd /d/LinuxScript mkdir shell_make cd shell_make for ((i=0; i<20; i++)); do touch test_zyr_$i.txt done
掌握了順序、分支、循環語句,在任何一個語言之中,我們都能夠游刃有余了,這是因為程序最基本的三個元素就是這些語句了,只要我們多加熟悉,掌握其中的精妙之處,注意標點符號、空格、特殊字符的用法,再加上Linux中的一些基本的命令,我們就能很好的使用腳本來完成我們想要做的工作了。
2.4、Linux之中命令的一些基本技巧
使用curl抓取網頁:
curl www.baidu.com
抓取並保存文件:
curl -o zyr.baidu www.baidu.com
#!/bin/bash response=$(curl www.baidu.com) echo $response
三、總結
其實Linux腳本很容易學習,最重要的是多練習,並且有參考資料,可以及時去查閱,總體來說,使用Linux腳本的前提就是要掌握好Linux的命令,特別是那些常用的命令,之后將自己任務中常用的操作設計成腳本,然后使用起來就很方便了。當然還有很多東西都沒有講到,比如case語句,一些基本的符號表示的含義等等,但是這些在使用的時候還是很常用的,我們需要經常練習才行。