作為一個程序員,什麽是腳本。必須要理解
Javascript 是一門動態類型、面向對象的腳本語言。
對腳本進行一個感性的認識。就是一個跟計算機執行的文本。
理解腳本
如果你打開一本 JavaScript 教程,那麽很可能在第一章就看到這句話:
JavaScript 是一門動態類型、面向對象的腳本語言。
然而很多前端工作一年都不清楚這個腳本是什麽意思。
其實腳本原本來自戲劇舞臺,比如下面這個腳本:
公館一室內
王媽:(小心翼翼地)小姐,您還是得註意身子,就吃點東西吧。
雞小姐:(把碗砸在地上)不吃,我就是不吃。
(王媽下)
腳本主要由人物對話和舞臺提示組成。演員和道具組只需要按照腳本說的做即可。
編程領域的腳本也是類似的,計算機只要照著腳本上說的做即可,比如下面這個腳本:
cd ~/Desktop
mkdir demo
cd demo
echo "hi" > index.html
cd ~/Desktop
所以說,腳本就是給計算機照著做的。這是我們對「腳本」的一個感性認識。接下來我們寫一個腳本。
寫一個腳本
- 找個地方新建文件,後綴隨意,一般來說腳本的後綴是 .sh。我喜歡把腳本放在 ~/local 目錄裏。(我知道你沒有這個目錄,創建這個目錄不就行了)
mkdir ~/local
cd ~/local
touch demo.txt
- 編輯 demo.txt,內容如下:
mkdir demo cd demo mkdir css js touch index.html css/style.css js/main.js exit
- (Windows 用戶請跳過這一步)給 demo.sh 添加執行權限
chmod +x demo.txt
- 在任意位置執行
sh ~/local/demo.txt
即可運行此腳本cd ~/Desktop
sh ~/local/demo.txt
- 你會看到當前目錄裏多出一個 demo 目錄,demo 目錄裏面還有一些文件
好了,這個 demo.txt 就是你寫出的第一個 Bash 腳本了。
- 將 ~/local 添加到 PATH 裏
cd ~/local; pwd
得到 local 的絕對路徑- 創建 ~/.bashrc:
touch ~/.bashrc
- 編輯 ~/.bashrc:
start ~/.bashrc
,在最後一行添加export PATH="local的絕對路徑:$PATH"
- source ~/.bashrc
- 之前你要運行
sh ~/local/demo.txt
,現在你只需要運行 demo.txt 就行了(想想為什麽,道理顯而易見)
- demo.txt 的後綴 .txt 很無聊,刪掉它
mv ~/local/demo.txt ~/local/demo
- 現在你只要運行
demo
就能執行該腳本了。
細節
liunx系統中。可執行的文件就是腳本。不可執行的文件就是PATH。(配置文件)
- PATH 的作用
你每次在 Bash 裏面輸入一個命令時(比如 ls、cp、demo),Bash 都會去 PATH 列表裏面尋找對應的文件,如果找到了就執行。 - 使用 type demo 可以看到尋找過程
- 使用 which demo 可以看到尋找結果
- 文件後綴的作用:毫無作用
你以為一個文件以 .exe 結尾就一定可以雙擊嗎?你以為一個文件以 .png 結尾就一定是圖片嗎?圖樣圖森破! - windows中文件後綴的名作用是用什麽工具打開它。
參數
demo 腳本只能創建名字為 demo 的目錄,太無聊了,我們讓目錄名是可變的吧。
mkdir $1
cd $1
mkdir css js
touch index.html css/style.css js/main.js
exit
$1 表示你傳的第一個參數。
老師你怎麽知道 $1 表示第一個參數?
好問題,答案是
我 Google 出來的 http://lmgtfy.com/?q=bash+first+param
用百度也行 http://www.baidu-x.com/?q=bash+%E7%AC%AC%E4%B8%80%E4%B8%AA+%E5%8F%82%E6%95%B0
判斷目錄是否已存在
if [ -d $1 ]; then
echo ‘error: dir exists‘
exit
else
mkdir $1
cd $1
mkdir css js
touch index.html css/style.css js/main.js
echo ‘success‘
exit
fi
老師,你怎麽知道 -d $1 可以判斷目錄是否存在?
我 Google 出來的 http://lmgtfy.com/?q=bash+dir+exists
返回值
exit 0
表示沒有錯誤exit 1
表示錯誤代碼為 1
demo && echo ‘結束‘
只有在 demo 成功時,才會執行 echo ‘結束‘
思考題
我們創建的 index.html style.css 和 main.js 都是空文件,如何給他們填充內容呢?
Node.js 寫腳本
上面我們寫的腳本叫做 Bash Script(Bash腳本)。
JS 的全稱叫做 JavaScript(Java腳本),雖然 JS 和 Java 沒什麽關系,但是 JS 依然是一種腳本。
- 我們在 Bash 命令行裏輸入 Bash 命令,也可以在 Node.js 命令行裏輸入 JS 命令(<kbd>Ctrl</kbd> + <kbd>D</kbd> 退出)
- Bash 腳本能做的事情,JS 腳本也能做。(
sh demo.sh
對應node demo.js
)
用 JS 切換目錄
console.log(process.cwd()) // 打印當前目錄
// process.chdir(‘~/Desktop‘); // 這句話不行的,因為 JS 不認識 ~ 目錄
process.chdir("/Users/frank/Desktop")
console.log(process.cwd()) // 打印當前目錄
console.log 就相當於 echo
用 JS 腳本創建目錄
Google nodejs create dir
文檔:https://nodejs.org/api/fs.html#fs_fs_mkdirsync_path_mode
let fs = require("fs")
fs.mkdirSync("demo")
用 JS 腳本創建文件
Google nodejs create file
文檔: https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options
let fs = require(‘fs‘)
fs.writeFileSync("./index.html", "")
用 JS 腳本來重寫 demo.sh
-
創建 ~/local/jsdemo.js,內容如下
var fs = require(‘fs‘) var dirName = process.argv[2] // 你傳的參數是從第 2 個開始的 fs.mkdirSync("./" + dirName) // mkdir $1 process.chdir("./" + dirName) // cd $1 fs.mkdirSync(‘css‘) // mkdir css fs.mkdirSync(‘js‘) // mkdir js fs.writeFileSync("./index.html", "") fs.writeFileSync("css/style.css", "") fs.writeFileSync("./js/main.js", "") process.exit(0)
- (Windows 用戶跳過這一步)給 jsdemo.js 加上執行權限
chmod +x ~/local/jsdemo.js
cd ~/Desktop
node ~/local/jsdemo.js zzz
,就可以看到 zzz 目錄創建成功了
shebang
我們每次執行 ~/local/jsdemo.js 都要用 node 來執行,能不能做到不加 node 也能執行呢(也就是指定執行環境),可以,在 jsdemo.js 第一行加上這一句即可:
#!/usr/bin/env node
(以下操作在 Windows 上可能失敗,失敗了就算了)
- 然後你就可以直接用
~/local/jsdemo.js zzz
了(省得輸入 node 了)。 - 如果你已經把 ~/local 加入了 PATH,那麽甚至可以直接輸入
jsdemo.js zzz
來執行。 - 如果你再把 jsdemo.js 的後綴 .js 去掉,就可以直接
jsdemo zzz
了。
註意,你每次執行前最好刪掉 zzz 目錄,以免發生沖突。
總結
我們學會了
- 腳本就是給機器一行一行執行的文本
- Bash 腳本有 Bash 腳本的語法,Node.js 腳本有 JS 語法
- 不管是那種腳本,能實現的功能都差不多,只是語法不同
- Bash 腳本的語法挺奇葩的,比如 $1 $# 等符號
- 不用特別去學 Bash 腳本的用法,遇到不會的就 Google
- 不用特別去學 Node.js 腳本的用法,遇到不會的就 Google
- 新人寫代碼最大的問題就是「抄錯了」
- 多寫了一個空格
- 少寫了一個空格
- 單詞拼錯了
- 沒有加分號
- 多加了分號
作為一個程序員,什麽是腳本。必須要理解