腳本編程基礎知識

你以爲什麼是腳本?

  不知道你有沒有接觸過高級編程語言,比如C、C++、Java等,這些語言的執行通常需要經過編寫-編譯-鏈接-運行等過程,而腳本語言則不然。一個腳本通常是解釋運行而非編譯。
  我們在維基百科上搜Script(腳本),得到的結果有兩個——劇本和腳本程序。雖然說兩個是不一樣的東西,但依然是可以放在一起理解的。所謂的劇本,就是演員照着一步一步做的東西。比如下邊的這一段

  而我們編程領域的腳本程序不是給人照着做的,而是給計算機照着做的。你輸入指令,讓計算機能夠看懂,然後計算機爲你一步一步執行這些指令。

讓我們來試着寫一個腳本?

  1. 進入一個目錄,然後新建腳本文件,一般腳本文件的後綴是.sh,但是它並沒有什麼用。在Windows下文件的後綴名決定着該文件的默認打開方式,但在命令行下,打開方式是我們手動指定的,比如vim demo.txt或者open -a 'Google Chrome' demo.txt都是可以的。所以命令行下我們寫後綴主要還是給我們自己看,讓我們自己一眼就知道這個文件是個什麼文件。
      我們在/f/wcy/local文件目錄下建立一個demo.sh文件。
  2. 編輯demo.sh文件。vim demo.sh(當然,你也可以用其他方式打開然後編輯。或者你也可以寫下其他的腳本代碼。)
mkdir demo //新建一個名爲demo的目錄
cd demo //進入demo這個目錄
mkdir css js //新建兩個文件夾css和js
touch index.html css/style.css js/main.js //新建三個文件
exit //退出
  1. (Windows不需要)給demo.sh添加執行權限chmod +x demo.sh
  2. 在你需要執行該腳本的目錄執行sh /f/wcy/local/demo.sh,然後你就可以在當前目錄看到你需要的demo文件夾以及裏邊你使用腳本創建的文件了。
  3. 事實上,你可以現在結束這篇文章,因爲你已經成功地運行了一個你自己寫的腳本。但是,作爲一名程序員,你還需要知道一些其他的東西。比如——把你的腳本文件目錄添加到path中。
      玩過java的應該對path都不會太陌生,雖然可能並不能理解path的含義,但是多少都應該是聽過的。這裏我不想太深入寫,只能說,path裏邊可以寫一堆目錄,我們每次輸入命令的時候都會依次在這些目錄裏邊查找有沒有同名的文件,如果有就執行。
      type命令可以顯示這個查找的過程。which命令可以告訴你查詢最終的結果是什麼,比如which mkdir在我這邊執行的結果就是/usr/bin/mkdir。在計算機當中,所有的命令都是可執行文件,也就是,腳本。計算機中不可執行的文件是配置文件,就是我們常說的config文件。
      以上,我們只需要把/f/wcy/local(請修改成你的腳本文件存在的目錄)添加到~/.bashrc(這個文件不解釋了,以前解釋過。常見問題合集,修改bash命令路徑下有這個文件的作用,事實上你可以不用瞭解。)
      先進入local目錄,輸入pwd得到它的絕對路徑。然後touch ~/.bashrc創建.bashrc文件。接着打開文件,在最後一行添加export PATH="local的絕對路徑:$PATH"。然後source ~/.bashrc。成功。之前你需要運行sh /f/wcy/local/demo.sh而現在你可以不需要輸入路徑直接運行sh demo.sh了。
  4. 僅僅是創建一個名爲demo的文件夾會不會太單調了呢?讓我們來加個參數吧!
      在bash裏邊,$1表示第一個參數,別問我怎麼知道的,自己搜去。你只需要看懂下邊的代碼就好了,有需要的功能再去搜索。
mkdir $1
cd $1
mkdir css js
touch index.html css/style.css js/main.js
exit

  現在,你可以運行sh demo.sh aa來創建一個名爲aa的文件夾了。
7. 如果說我已經創建過一個名爲aa的文件夾,然後又來運行sh demo.sh aa呢?顯而易見,它是會報錯的。那麼我們能不能不讓它報那麼難看的錯,給用戶一個提示信息呢?是的,加一個判斷。如果這個文件存在,那麼就讓它輸出”The directory is already exist!”,如果不存在那就創建。所以,你可以Google一下bash腳本的if語句怎麼用。這裏是代碼。

if [ -d $1 ]; then
  echo 'The directory is already exist!'
  exit 1 //表示程序運行出錯,錯誤代碼爲1
else
  mkdir $1
  cd $1
  mkdir css js
  touch index.html css/style.css js/main.js
  echo 'success'
  exit 0 //表示0個錯誤
fi
  1. 是的,經過上述步驟基本已經完成了一個小腳本案例了。我們最後來進行測試環節。
sh demo.sh aa && echo '成功' //如果前邊的程序執行成功就顯示字符串“成功”
sh demo.sh bb || echo '失敗' //如果前邊的程序返回的是非0,顯示“失敗”

換個node.js腳本玩玩?

  我們上邊寫的腳本是Bash Script(Bash腳本),現在,換個我們前端用的js腳本玩玩?基本規則其實都差不多,兩個的語法方面略微有一點差別。你想要實現什麼功能的話都可以去Google。比如你可以搜索node js change dir,來找到如何在node下轉換路徑。你也可以進入nodejs官網nodejs.org–>docs–>api直接在裏邊查,比如文件系統(file system—fs)的一些操作。

node //先進入node
process.chdir('F:\\wcy\\local') //改變系統路徑到你需要的目錄(這個路徑寫法是windows下的寫法。。。保持微笑不吐槽)
console.log(process.cwd())  //得到當前所處路徑並打印出來console.log()相信你不會陌生。
//Ctrl+D退出node環境

  上邊用bash命令我們執行寫的是sh demo.sh,如果你省略sh直接寫demo.sh依然可以得到你想要的結果。因爲系統默認使用sh(即shell)來運行腳本。但到了這裏可就不行了。你知道的,文件後綴並不影響,所以如果你依然用shell來執行demo.js文件,顯然是有問題的。我們一般會用node demo.js來運行這個文件。如果你想讓這個文件默認用node執行,請在文件的第一行加上#!/usr/bin/env node
綜上,將上述功能換成js腳本的話,就應該是這樣的:

#!/usr/bin/env node
var fs = require('fs');
dirName = process.argv[2] // 你傳的參數是從第 2 個開始的
if (fs.existsSync(dirName)) {
    console.log("The file is already exist");
    process.exit(1);
}
    fs.mkdirSync("./" + dirName) // mkdir $1
    process.chdir("./" + dirName) // cd $1
    fs.mkdirSync('css') // mkdir css
    fs.mkdirSync('js') // mkdir js
    fs.writeFileSync("./index.html", "<!DOCTYPE><title>Hello</title><h1>Hi</h1>")
    fs.writeFileSync("css/style.css", "h1{color: red;}")
    fs.writeFileSync("./js/main.js", "var string = 'Hello World' alert(string)")
    process.exit(0)

  這裏對第三行稍微解釋一下,爲什麼前邊bash傳的參數算是第一個而後邊js算是第二個呢?給一段代碼吧,反正我是這樣理解的。demo.sh xxnode demo.js xx,從0開始數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章