什么是脚本
你可能见过这样一句话:
JavaScript是一门动态类型、面向对象的脚本语言。
但是你可能学习使用了很久的 JS 还是不知道脚本的意思。脚本源于舞台剧,主要包含了人物对话和舞台提示,演员根据脚本来演出。类似地,编程领域中计算机根据脚本的命令做,比如:
cd ~/Desktop
mkdir demo
cd demo
echo "hi" > index.html
cd ~/Desktop
所以说,脚本就是给计算机照着做的“本子”。先有一个感性认识,紧接着我们来写一个脚本
写一个脚本
- 打开 Git Bash,进入到一个你喜欢的目录,比如 ~/haha(没有那你可以新建一下啊)
mkdir ~/haha
cd ~/haha
touch demo.txt
- 事实上,脚本一般都是 .sh 后缀的文件,但是 linux 在你编辑打开 .sh 后缀的文件就会执行,所以我就写成 .txt,编辑完成 mv 成 .sh 执行即可
- 编辑 demo.txt:
mkdir demo
cd demo
mkdir css js
touch index.html css/style.css js/main.js
exit(写不写都行)
- (Windows 用户跳过)给 demo.txt 添加执行权限
chmod +x demo.txt
- 在任意目录下执行
sh ~/haha/demo.txt
,比如:
cd ~/Desktop
sh ~/haha/demo.txt
你会发现桌面上出现了 demo 目录,其中还有一些文件
好啦,到目前为止,你写出了你的第一个 Bash 脚本 demo.txt
- 将 ~/haha 添加到 PATH 里
cd ~/haha
pwd (得到 /haha 的绝对路径)
start ~/.bashrc (编辑 ~/.bashrc 文件)
在文件中加一行 export PATH="/haha的绝对路径:$PATH"
source ~/.bash_profile (之前运行需要 sh ~/haha/demo.txt,现在只需要 demo.txt)
mv ~/haha/demo.txt ~/haha/demo (干掉无聊的后缀)
最终你只需运行 demo 即可执行该脚本
细节
- PATH 的作用:
- 可以说命令行系统中的命令本质上就是一个个脚本,你每次在 Bash 中输入一个命令(如ls、mkdir、demo),Bash 都会去 PATH 列表中寻找对应的文件,如果找到了就执行。
- 前面将 /haha 的绝对路径加入到 PATH 中,demo.txt 相当于变成了一个命令(当然它本身就是脚本文件),当你直接执行 demo(干掉了没用的后缀)时,Bash 从 PATH 中找到了就执行咯。
type 命令
(如 type dmeo)可以看到寻找命令的过程which 命令
可以看到寻找命令的结果
- 文件的后缀事实上毫无作用,对 linux 来说打开文件可以自己指定,如:
open -a 'Google Chrome' main.js
(用 Chrome 浏览器打开 main.js)。并且后缀并不能指定文件是什么,比如以 .png 结尾的文件可能是一个空白文件,而不是一张图片。 - 打开 PATH 的方法:
echo $PATH
,运行一个命令,Bash 就会去 PATH 中从头开始找,找到就运行。对 linux 来说,所有的命令都是脚本文件(可执行文件),不可执行文件就是配置。
参数
前面的脚本只能创建名字叫 demo 的目录,那我想创建一个叫 pemo 的目录怎么办呢?太单调了,我们来让目录名可变吧:
mkdir $1
cd $1
mkdir css js
touch index.html css/style.css js/main.js
exit
$1 表示第一个参数,即 demo pemo(创建叫 pemo 的目录)中的 pemo
我咋知道的?
。。
谷歌出来的啊
判断目录是否已存在
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 可以表示目录是否存在,也是我谷歌出来的
以上是这些莫名其妙的语法是 Bash 语法,需要时谷歌即可,不必刻意去学
Node.js脚本
上面我们写的脚本叫做 Bash Script (Bash 脚本),当然 JavaScript 不是 Java 脚本,虽然 JS 与 Java 没半毛线关系,但是 JS 依然是一种脚本。
- 我们在 Bash 命令行中输入 Bash 命令,同样的,也可以在 Node.js 命令行中输入 JS 命令。(在 Bash 中运行 node 即可进入 Node.js 命令行,退出<Ctrl+D>)
- Bash 脚本可以做的事,JS 脚本也可以做。(sh demo.sh VS node demo.js)
- 脚本一般分为两种形式:一行一行输入的;写好一个文件一次性执行的
用 JS 切换目录
console.log(process.cwd()) // 打印当前目录 process.chdir("/Users/frank/Desktop") // 切换目录到桌面(Windows 用户前面加 /c)
console.log()
相当于echo
process.cwd()
相当于pwd
JS 不认识 ~
用 JS 脚本创建目录
let fs = require("fs") fs.mkdirSync("demo")
用 JS 脚本创建文件
let fs = require("fs") fs.writeFileSync("./index.html", "")
用 JS 脚本重写 demo.sh
var fs = require('fs') var dirName = process.argv[2] // 你传的参数是从第 2 个开始的 即 node jsdemo xxx process.chdir("/Users/xxx/Desktop") // cd Desktop fs.mkdirSync("./" + dirName) // mkdir $1 process.chdir("./" + dirName) // cd $1 fs.mkdirSync(‘css’) // mkdir css fs.mkdirSync('js') // mkdir js fs.writeFileSync("./index.html", "") // touch index.html fs.writeFileSync("css/style.css", "") // touch css/style.css fs.writeFileSync("./js/main.js", "") // touch js/main.js process.exit(0) chmod +x ~/haha/jsdemo.js // Windows 用户跳过这一步 cd ~/Desktop node ~/haha/jsdemo.js aaa
运行完成即可在桌面看到 aaa 目录
shebang
- 每次必须用
node ~/haha/jsdemo.js
来执行,能不能不要每次都加 node(即指定执行环境) ? 只需在脚本文件第一行前加上#!/usr/bin/env node
即可。- 当然我们已经将 /haha 加入 PATH,然后 mv 掉后缀,最终我们只需运行
jsdemo aaa
就可以创建 aaa目录(最好删掉桌面已有的 aaa 目录,不然重复操作有冲突)
总结
- 脚本就是给计算机一行一行执行的文本,而 Node.js 本质上就是脚本
- Bash 脚本有 Bash 语法,Node.js 脚本有 JS 语法
- 不管哪种脚本,能实现的功能都差不多,只是语法不同
- 不用刻意去学 Bash 语法,现阶段也不用去学 JS ,上面的 Node.js 脚本语法大致知道什么意思即可