脚本入门

注意 Windows 有个臭毛病

视频里的路径是 /Users/frank/Desktop ,Windows 上这个路径会报错。
你要把这个路径写成 Windows 的专属格式

  1. /c/Users/frank/Desktop
  2. C:\\Users\\frank\\Desktop
  3. C:\Users\frank\Desktop
    具体是哪一个路径各种情况不一样,我就不细讲了,你把三个路径全试一遍,哪个能用用哪个就行了。

脚本

脚本就是给计算机照着做的

写一个Bash脚本

  1. 找个地方新建文件,后缀随意,一般来说脚本的后缀是.sh,把脚本放在~/local目录里。(我知道你没有这个目录,创建一下这个目录就行啦)
    • mkdir ~/.local
    • cd ~/local(请注意倒车,此处需要留心)
    • touch demo.txt
  2. 编辑demo.txt,内容如下:
1
2
3
4
5
6
pwd #确认一下当前路径是不是~/local
mkdir demo #在当前目录下创建demo文件夹
cd demo #进入demo文件夹里,切换所在目录
mkdir css js #创建css,js文件夹
touch index.html css/style.css js/main.js #新建相应的文件
exit #退出,写不写都可以
  1. (Windows 用户请跳过这一步)给 demo.txt 添加执行权限 chmod +x demo.txt
  2. 在任意位置执行sh ~/local/demo.txt,即可运行此脚本
    • cd ~/Desktop
    • sh ~/local/demo.txt
    • 当前目录里多出一个demo目录,demo目录里面还有一些文件,这个demo.txt就是你写的第一个Bash脚本
  3. ~/local添加到PATH里
    1. cd ~/local; pwd 得到 local的绝对路径
    2. 临时设置 PATH
      1. 运行 export PATH="local的绝对路径:$PATH",这句话是把 local 目录加到 PATH 里,注意替换 local的绝对路径
      2. 这时你只要运行 demo.txt 就相等于运行 sh ~/local/demo.txt 了(你可能会看到 File exists 的报错,不用管它)
    3. 永久设置PATH,上面的 PATH 在你重启 Bash 之后就会失效,如果你希望 PATH 一直生效,看下面
      1. 创建 ~/.bashrctouch ~/.bashrc
      2. 编辑 ~/.bashrcstart ~/.bashrc(Windows下使用start,Mac使用open)
      3. 在编辑器里添加一行字:export PATH="local的绝对路径:$PATH"
      4. source ~/.bashrc
      5. 之前你要运行 sh ~/local/demo.txt,现在你只需要运行 demo.txt
  4. 如果你觉得 demo.txt 的后缀 .txt 没什么用,可以用下面的命令删掉它
    1. mv ~/local/demo.txt ~/local/demo
    2. 现在你只要运行 demo 就能执行该脚本了。

细节

  1. PATH 的作用
    你每次在 Bash 里面输入一个命令时(比如 ls、cp、demo),Bash 都会去 PATH 列表里面寻找对应的文件,如果找到了就执行。
  2. 使用 type demo 可以看到寻找过程
  3. 使用 which demo 可以看到寻找结果
  4. 文件后缀的作用:毫无作用

参数

我们让目录名是可变的吧。

demo.txt 目录名

1
2
3
4
5
mkdir $1	#$1 表示你传的第一个参数
cd $1
mkdir css js
touch index.html css/style.css js/main.js
exit

判断目录是否已存在

1
2
3
4
5
6
7
8
9
10
11
if [ -d $1 ]; then	#-d $1 可以判断目录是否存在
echo 'error: dir exists'
exit 1
else
mkdir $1
cd $1
mkdir css js
touch index.html css/style.css js/main.js
echo 'success'
exit 0
fi

返回值

  • exit 0 表示没有错误
  • exit 1 表示错误代码为 1

小Tips

  • 命令1 && 命令2:命令1执行成功后,就执行命令2
  • 命令1 || 命令2:命令1执行失败后,就执行命令2
  • 命令1; 命令2 :命令1执行完后,就执行命令2

Node.js脚本

  • 我们在 Bash 命令行里输入 Bash 命令,也可以在 Node.js 命令行里输入 JS 命令(Ctrl + D 退出)
  • Bash 脚本能做的事情,JS 脚本也能做。(sh demo.sh 对应 node demo.js

用JS切换目录

1
2
3
4
console.log(process.cwd())	//打印当前目录
// process.chdir('~/Desktop'); // 这句话不行的,因为 JS 不认识 ~ 目录
process.chdir('/Users/frank/Desktop')
//上面这条语句在Windows上有毛病,要修改

用JS脚本创建目录

Google nodejs create dir

1
2
let fs = require('fs');
fs.mkdirSync('demo'); //创建demo文件夹

用JS脚本创建文件

Google nodejs create file

1
2
let fs = require('fs');
fs.writeFileSync('./index.html',''); //创建index.html

用JS脚本重写demo.sh(Bash脚本)

  1. 创建~/local/jsdemo.js,内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)
  1. (Windows 用户跳过这一步)给 jsdemo.js 加上执行权限 chmod +x ~/local/jsdemo.js
  2. cd ~/Desktop
  3. node ~/local/jsdemo.js zzz,就可以看到 zzz 目录创建成功了

shebang

不加 node 也能执行呢(也就是指定当前脚本的执行环境),可以,在 jsdemo.js 第一行加上这一句即可:

1
#!/usr/bin/env node
  1. 然后你就可以直接用 ~/local/jsdemo.js zzz 了(省得输入 node 了)。
  2. 如果你已经把 ~/local 加入了 PATH,那么甚至可以直接输入 jsdemo.js zzz 来执行。
  3. 如果你再把 jsdemo.js 的后缀 .js 去掉,就可以直接 jsdemo zzz 了。

总结

  1. 脚本就是给机器一行一行执行的文本
  2. Bash脚本有Bash脚本的语法,Node.js脚本有JS语法,实现的功能都差不多
  3. Bash 脚本的语法挺奇葩的,比如 $1 $# 等符号
  4. 不用特别去学 Bash 、Node.js脚本的用法,遇到不会的就 Google
  5. 新人写代码最大的问题就是「抄错了」

练习

自己用Node.js脚本完成课堂中的 demo.js,实现以下功能

  1. demo.js xxx 可在当前目录下生成目录 xxx,demo.js yyy 可生成目录 yyy

  2. 如果要生成的目录已经存在,则直接退出

  3. 生成的目录结构如下:

    1
    2
    3
    4
    5
    ├── css
    │ └── style.css
    ├── index.html
    └── js
    └── main.js
  4. index.html 的内容为

    1
    2
    3
    <!DOCTYPE>
    <title>Hello</title>
    <h1>Hi</h1>
  5. css/style.css 的内容为

    1
    h1{color: red;}
  6. js/main.js 的内容为

    1
    2
    var string = "Hello World"
    alert(string)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env node
var fs = require('fs');
var dirName = process.argv[2]; //传的参数是从第2个开始的

var exists = fs.existsSync('./'+dirName);
if(exists){//判断文件夹是否存在
console.log(dirName+"这个文件夹已经存在");
}else{
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>\n<title>Hello</title>\n<h1>Hi</h1>');
fs.writeFileSync('./css/style.css','h1{color: red;}');
fs.writeFileSync('./js/main.js','var string = "Hello World";\nalert(string);');
}

process.exit(0)