脚本

脚本

脚本是什么

1
2
3
公馆一室内
王妈:(小心翼翼地)小姐,您还是得注意身子,就吃点东西吧。
鸡小姐:(把碗砸在地上)不吃,我就是不吃。

脚本主要由人物对话和舞台提示组成。演员和道具组只需要按照脚本说的做即可。

这里看明白了,也就明白脚本是什么了 :

  • 脚本就是运行时按照已经写好,写在里面的内容既定运行 。而这些内容会有一些动作上的指令完成,下面我们来学习一下bash脚本,与node脚本。

bash脚本

普通bash脚本

1
2
3
mkdir ~/local
cd ~/local
touch demo.sh

编辑demo.sh内容如下:

1
2
3
4
5
mkdir demo
cd demo
mkdir css js
touch index.html css/style.css js/main.js
exit

运行demo.sh: 输入sh ~/local/demo.sh会执行以下操作

  • 创建demo目录
  • 进入demo目录
  • … 依次执行

    bash脚本语言

    参数

    编辑demo.sh内容如下:
    1
    2
    3
    4
    5
    mkdir $1
    cd $1
    mkdir css js
    touch index.html css/style.css js/main.js
    exit

$1 表示你传的第一个参数。
此处不懂可以谷歌或百度 : bash+first+param or bash 第一个参数
运行demo.sh: 输入sh ~/local/demo.sh xxx会执行以下操作

  • 创建xxx目录
  • 进入xxx目录
  • … 依次执行

    判断

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

运行demo.sh: 输入sh ~/local/demo.sh xxx会执行以下操作

  • 判断xxx目录是否存在
  • 如果存在就exit退出
  • 如果不存在创建xxx目录
  • 进入xxx目录
  • … 依次执行

bash语言语法很奇怪,很严格 -d $1判断目录是否存在,谷歌搜索 ,代码最好复制粘贴 ,否则会容易出现问题

可以有返回值 exit 0exit 1
sh ~/local/demo && echo '创建成功' 当返回1时 则打印创建成功

PATH

  • cd ~/local; pwd 得到 local 的绝对路径
  • 创建 ~/.bashrc:touch ~/.bashrc
  • 编辑 ~/.bashrc:start ~/.bashrc,在最后一行添加 export PATH="local的绝对路径:$PATH" ~/ 计算机不认识, 需要pwd得到的local绝对路径填进去,注意路径符为 /
  • 文件后缀的作用:毫无作用
    你以为一个文件以 .exe 结尾就一定可以双击吗?你以为一个文件以 .png 结尾就一定是图片吗?图样图森破! 文件的后缀只是确定运行平台的
  • 所以我们去掉文件后缀
    mv ~/local/demo.sh ~/local/demo
  • PATH 的作用
    你每次在 Bash 里面输入一个命令时(比如 ls、cp、demo),Bash 都会去 PATH 列表里面寻找对应的文件,如果找到了就执行。所以我们把脚本都放在~/local目录中,而local绝对路径又放在PATH环境变量中,每次运行demo xxx就会自动去path中寻找命令
  • 使用 type demo 可以看到寻找过程
  • 使用 which demo 可以看到寻找结果

最后我们可以直接使用demo xxx去执行脚本了

Node 脚本

上面我们写的脚本叫做 Bash Script(Bash脚本)。
JS 的全称叫做 JavaScript(Java脚本),虽然 JS 和 Java 没什么关系,但是 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")
console.log(process.cwd()) // 打印当前目录

console.log 就相当于 echo

用 JS 脚本创建目录

Google nodejs create dir

文档:https://nodejs.org/api/fs.html#fs_fs_mkdirsync_path_mode

1
2
let fs = require("fs")
fs.mkdirSync("demo")

用 JS 脚本创建文件

Google nodejs create file

文档: https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options

1
2
let fs = require('fs')
fs.writeFileSync("./index.html", "")

用 JS 脚本来重写 demo.sh

  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)
  2. cd ~/Desktop

  3. node ~/local/jsdemo.js zzz,就可以看到 zzz 目录创建成功了

shebang

我们每次执行 ~/local/jsdemo.js 都要用 node 来执行,能不能做到不加 node 也能执行呢(也就是指定执行环境),可以,在 jsdemo.js 第一行加上这一句即可:

1
#!/usr/bin/env node

(以下操作在 Windows 上可能失败,失败了就算了)

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

注意,你每次执行前最好删掉 zzz 目录,以免发生冲突。

总结

  1. 脚本就是给机器一行一行执行的文本
  2. Bash 脚本有 Bash 脚本的语法,Node.js 脚本有 JS 语法
  3. 不管是那种脚本,能实现的功能都差不多,只是语法不同
  4. Bash 脚本的语法挺奇葩的,比如 $1 $# 等符号
  5. 不用特别去学 Bash 脚本的用法,遇到不会的就 Google
  6. 不用特别去学 Node.js 脚本的用法,遇到不会的就 Google
  7. 写代码最大的问题就是「抄错了」
  • 多写了一个空格
  • 少写了一个空格
  • 单词拼错了
  • 没有加分号
  • 多加了分号